首页 > 代码库 > UVALive 4953 Wormly--【提醒自己看题要仔细】

UVALive 4953 Wormly--【提醒自己看题要仔细】

有一条虫要过桥,桥有断的木板和好的木板。虫有L条腿B个身体,桥长N。01串表示桥的好坏。输出最少操作次数。

一开始虫的身体在最左B桥上,腿在最左L桥上,最后要到达最右B以及最右L。。。

操作有2种:①所有身体前进一步②某一条腿前进任意步。。。。整个过程要保证每个身体下只能有一条腿。。。。还有就是任意一条腿不能overtake(追上、赶上)其他腿。。

输入保证起点终点的桥都是完好的。。。

鉴于中文水平跟英语水平都不高。。。题意请自行YY脑补。。。

 

看题不仔细。。。。再次坑队友。。。。大家好,我是坑神=。=真感谢 前度和现队友 对我的体谅。。。。。

一开始没留意到overtake是这个意思(英语渣),然后上线段树、优先队列。。。。复杂度其实也很高。。。

 

赛后看清题意后。。在自己的基础上,加了个sum数组,参考队花NX的。。。。sum[i]表示前i个桥好桥的个数。。。不知为啥比队花的要快。。。看不懂队花的做法。。

这个复杂度大概是O(n)吧。。。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <string>
 7 #include <vector>
 8 using namespace std;
 9 
10 #define ll long long
11 #define mod 1000000007
12 #define inf 0x3f3f3f3f
13 #define eps 1e-8
14 #define maxn 1000010
15 
16 char str[maxn];
17 int sum[maxn];
18 int main(){
19     int t;
20     int leg,body,n;
21     scanf("%d",&t);
22     while(t--){
23         scanf("%d%d%d",&leg,&body,&n);
24         scanf("%s",str+1);
25         if(leg==body){
26             printf("%s\n",body==n?"0":"IMPOSSIBLE");
27             continue;
28         }
29         sum[0]=0;
30         for(int i=1;i<=n;++i)sum[i]=sum[i-1]+(str[i]-0);
31         bool can=true;
32         for(int i=body;i<=n;++i)if(sum[i]-sum[i-body]<leg){can=false;break;}
33         if(can==false){puts("IMPOSSIBLE");continue;}
34         ll ans=0;
35         int l=1;
36         int bb=1,bb2=body;
37         while(l!=n+1-leg){
38             if(bb<l&&bb2!=n){
39                 int dx = min(l-bb,n-bb2);// bb2+dx<=n
40                 ans+=dx,bb+=dx,bb2+=dx;
41             }
42             if(sum[bb2]-sum[l]<leg){can=false;break;}
43             while(sum[bb2]-sum[l]>=leg)++l;
44             ans+=leg;
45         }
46         if(can)printf("%lld\n",ans);
47         else puts("IMPOSSIBLE");
48     }
49     return 0;
50 }
View Code