167 条题解
-
0sdvsdv LV 10 @ 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枚举闪烁法术次数.
-
02008-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层状态的程序如何实现,就看你的聪明才智了。 -
02008-09-29 21:40:23@
无语了,居然两次提交都没注意到大小写
-
02008-09-28 00:13:17@
定义dp:array[0..1,1..13] of longint;
循环的时候for j:=0 to 13 do
结果就过两个点。。。害我查半天。他编译怎么就能通过的呢。。。。 -
02008-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
气死我(七十五),真不是个好数字啊!!!!!!! -
02008-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 -
02008-09-16 21:00:19@
传说当年我这题搞了90分,想当年写了180多行的程序,现在懒得写了,不就一道AC数吗,咱不要了~~~
-
02008-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= -
02008-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]就够了,至于为什么嘛。。。自己想。。。) -
02008-09-11 18:57:36@
我用的DP,加了个小优化,还没你们快.....
郁闷啊............
我因为Yes打成YES,白白浪费了几次AC,郁闷.
顺便说句,楼上,楼上上,楼上上上都违规了. -
02008-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 有效耗时:0msprogram noip0703;
var i,j,m,s,time,t,f:longint;
begin
read(m,s,time);
t:=0;
f:=0;
while (m>=10)and(f -
02008-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 有效耗时:0msvar
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) -
02008-09-10 20:43:36@
知道是谁了吧......
干掉100%的人是.....ls -
02008-09-10 20:20:31@
...............
-
02008-08-28 23:21:39@
无语
-
02008-08-24 22:45:36@
怎么还没题目就有题解了。
-
-12017-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;
} -
-12017-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;
}
}
``` -
-12016-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; } } }
-
-12016-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.