167 条题解

  • 0
    @ 2008-10-04 23:02:17

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    枚举闪烁法术次数.

  • 0
    @ 2008-10-01 15:24:04

    这道题给大家写个详细题解,参见年鉴2007里孙辉的论文或者是访问www.mynoi.cn

    首先,将魔全部耗完。魔能耗就耗,若是魔没耗完就TLE了那肯定就是输出NO了!

    若是魔没耗完就逃离了,那肯定就是输出YES了!(注意YES和NO的大小写!)

    然后运用动态规划的思想来写。

    f(i是第几秒,j是多少魔)=max(f,f+17,f+60)(然后,注意下,f、f、f是不是有意义)

    大家看我是怎么使动态规划时的值有意义的

    d[m,t]表示t秒后,拥有m点魔法时,走出的最大距离。

    For j:= 0 to 13 do

    d[0][j] := -100;

    将数组赋值为-100,就是将第一次动规时不可能存在的状态去掉。(比如刚开始时,

    d[0,13]是不可能存在的,但是如果你把它作为状态也考虑进去,就会WA,我就是这样WA了三次,郁闷哦~~~附上这两个会WA的测试点:

    4 50 6 正确答案:3

    5 98 8 正确答案:6

    赶紧自己去测一下吧!)

    如果动规途中出现当前走的距离已经逃离出岛,就可以输出了。

    如果动规结束还没有出解,这时还是有两种情况!

    1、最后一次动规时出解,但是没来得及输出就退出动规了。

    2、本数据无解。

    对于第一种,将最终状态数组搜一遍,如果逃离距离的最大值满足条件的话,输出有解。否则,就是第二种,无解了。

    【总结】本题需要非常细心,有很多特殊情况要考虑,花了我不少时间!!

    最后,来说一下空间复杂度O(28)是怎么实现的。

    var

    d:array[0..1][0..13] of Longint;

    为什么用0..1就可以了呢?提示你一下,动规当前状态,实际上仅仅需要上几层状态的结果?至于仅保存2层状态的程序如何实现,就看你的聪明才智了。

  • 0
    @ 2008-09-29 21:40:23

    无语了,居然两次提交都没注意到大小写

  • 0
    @ 2008-09-28 00:13:17

    定义dp:array[0..1,1..13] of longint;

    循环的时候for j:=0 to 13 do

    结果就过两个点。。。害我查半天。他编译怎么就能通过的呢。。。。

  • 0
    @ 2008-09-20 18:57:21

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    气死我(七十五),真不是个好数字啊!!!!!!!

  • 0
    @ 2008-09-20 18:33:08

    简单题!!!

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

  • 0
    @ 2008-09-16 21:00:19

    传说当年我这题搞了90分,想当年写了180多行的程序,现在懒得写了,不就一道AC数吗,咱不要了~~~

  • 0
    @ 2008-09-13 19:24:46

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    当年耗了我2小时,毁了我的noip1=

  • 0
    @ 2008-09-13 16:00:10

    Noip时40分。。。导致了最后的340。。。今天一定要A了它!

    结果。。。A了。。。看来我的确有进步 = =

    当年搞了俩小时没搞出来。。。

    用DP比较方便,还可以开循环数组压缩= =

    先把可以闪的魔都闪光光,然后DP

    f(i是第几秒,j是多少魔)=max(f,f+17,f+60)(然后,注意下,f、f、f是不是有意义,我是开了个boolean数组。同样滚动。。。最后 其实 f[0..1,0..13]就够了,至于为什么嘛。。。自己想。。。)

  • 0
    @ 2008-09-11 18:57:36

    我用的DP,加了个小优化,还没你们快.....

    郁闷啊............

    我因为Yes打成YES,白白浪费了几次AC,郁闷.

    顺便说句,楼上,楼上上,楼上上上都违规了.

  • 0
    @ 2008-09-10 21:28:23

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    program noip0703;

    var i,j,m,s,time,t,f:longint;

    begin

    read(m,s,time);

    t:=0;

    f:=0;

    while (m>=10)and(f

  • 0
    @ 2008-09-12 12:54:30

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    var

    input,output:text;

    m,s,st,t,tt:longint;

    begin

    readln(m,s,t);

    if s0) do

    begin

    if (t>=((13-m) div 4+1)) and (s>34) and ((((s div 60*10+3-m) div 4+s div 60)*17)

  • 0
    @ 2008-09-10 20:43:36

    知道是谁了吧......

    干掉100%的人是.....ls

  • 0
    @ 2008-09-10 20:20:31

    ...............

  • 0
    @ 2008-08-28 23:21:39

    无语

  • 0
    @ 2008-08-24 22:45:36

    怎么还没题目就有题解了。

  • -1
    @ 2017-10-15 11:08:58

    #include<iostream>
    using namespace std;
    int f[3000010];
    int main()
    {
    int m,s,t;
    cin>>m>>s>>t;
    for(int i=1;i<=t;i++)
    {
    if(m>=10)
    {
    m=m-10;
    f[i]=f[i-1]+60;
    }
    else
    {
    f[i]=f[i-1]; m=m+4;
    }
    }
    for(int i=1;i<=t;i++)
    {
    if(f[i]<=f[i-1]+17) f[i]=f[i-1]+17;
    if(f[i]>=s)
    {
    cout<<"Yes"<<endl<<i;
    return 0;
    }
    }
    cout<<"No"<<endl<<f[t];
    return 0;
    }

  • -1
    @ 2017-08-11 16:53:13

    每个while循环所对应的操作如注释里所写
    ```cpp
    #include<iostream>
    #include<cstdio>
    using namespace std;

    int tottime,totway;
    int elstime,elsway;
    int mana;

    int main()
    {
    cin>>mana>>totway>>tottime;
    elstime=tottime;
    elsway=totway;

    while(mana>=10 and elstime>0 and elsway>0)
    {
    --elstime;
    mana-=10;
    elsway-=60;
    // cout<<"tp->";
    }

    while(mana>=6 and elstime>=2 and elsway>17)
    {
    mana-=6;
    elstime-=2;
    elsway-=60;
    // cout<<"rest->tp->";
    }

    while(elstime>=3 and mana>=2 and elsway>34)
    {
    mana-=2;
    elstime-=3;
    elsway-=60;
    // cout<<"rest->rest->tp->";
    }

    while(elstime>=7 and elsway>=120)
    {
    elstime-=7;
    elsway-=120;
    // cout<<"rest->rest->rest->rest->rest->tp->tp->tp";
    }

    while(elstime>0 and elsway>0)
    {
    elstime--;
    elsway-=17;
    // cout<<"run->";
    }

    // cout<<"end"<<endl;
    if(elsway>0)
    {
    cout<<"No"<<endl;
    cout<<totway-elsway<<endl;
    }
    else
    {
    cout<<"Yes"<<endl;
    cout<<tottime-elstime<<endl;
    return 0;
    }
    }
    ```

  • -1
    @ 2016-11-28 12:42:34

    感谢irj124 dalao提供的思路

    编译成功

    测试数据 #0: Accepted, time = 15 ms, mem = 4084 KiB, score = 10
    测试数据 #1: Accepted, time = 0 ms, mem = 4084 KiB, score = 10
    测试数据 #2: Accepted, time = 15 ms, mem = 4080 KiB, score = 10
    测试数据 #3: Accepted, time = 0 ms, mem = 4080 KiB, score = 10
    测试数据 #4: Accepted, time = 0 ms, mem = 4084 KiB, score = 10
    测试数据 #5: Accepted, time = 0 ms, mem = 4084 KiB, score = 10
    测试数据 #6: Accepted, time = 0 ms, mem = 4080 KiB, score = 10
    测试数据 #7: Accepted, time = 15 ms, mem = 4084 KiB, score = 10
    测试数据 #8: Accepted, time = 0 ms, mem = 4080 KiB, score = 10
    测试数据 #9: Accepted, time = 15 ms, mem = 4080 KiB, score = 10
    Accepted, time = 60 ms, mem = 4084 KiB, score = 100

    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<sstream>
    #include<algorithm>
    #include<string>
    #include<cstdio>
    #include<math.h>
    #include<cctype>
    #include<vector>
    
    #define maxn 300010
    
    using namespace std;
    struct
    {
        int c, m, b;
    } dp[maxn];
    int M, S, T;//魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。
    int main(){
        cin >> M >> S >> T;
        dp[0].c = dp[0].b = 0;
        dp[0].m = M;
        for (int i = 1; i <= T; i += 1){
            if (dp[i - 1].m >= 10)
            {
                dp[i].m = dp[i - 1].m - 10;
                dp[i].b = dp[i - 1].b + 60;
            }
            else
            {
                dp[i].m = dp[i - 1].m + 4;
                dp[i].b = dp[i - 1].b;
            }
            dp[i].c = max(dp[i - 1].c + 17, dp[i].b);
        }
        if (dp[T].c < S)
        {
            cout << "No" << endl << dp[T].c;
            return 0;
        }
        for (int i = 1; i <= T; i += 1){
            if (dp[i].c >= S){
                cout << "Yes" << endl << i;
                return 0;
            }
        }
    }
    
    • @ 2016-12-27 23:00:50

      有个问题:对于样例输出二,其10s内的魔法值及移动距离有如下关系:(从第0s到第10s)
      36 0
      26 60
      16 120
      6 180
      10 197
      0 240
      4 257
      8 274
      12 291
      2 308
      6 325

      其中,从第5s到第6s这一段时间魔法值有所上升,但移动距离为17,不满足题设条件“只有处在原地
      休息状态时才能恢复”这一项,对此有什么解释(或者哪里理解错了)?

    • @ 2016-12-27 23:27:10

      收回那句话= =比较两个数= =谢谢~

  • -1
    @ 2016-11-15 19:05:57
    var
    m,s,t,x,y,i:longint;
    begin
    readln(m,s,t);
    for i:=1 to t do begin
    x:=x+17;
    if m>=10 then begin m:=m-10;y:=y+60;end
    else m:=m+4;
    if x<y then x:=y; if x>=s then begin writeln('Yes');writeln(i);exit;end;
    end;
    writeln('No');writeln(x);
    end.
    

信息

ID
1431
难度
5
分类
动态规划 | 背包 点击显示
标签
递交数
6158
已通过
1917
通过率
31%
被复制
22
上传者