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 }

UVALive 4953 Wormly--【提醒自己看题要仔细】,布布扣,bubuko.com

时间: 2024-08-15 06:18:12

UVALive 4953 Wormly--【提醒自己看题要仔细】的相关文章

HTTP—这估计是你看的最仔细的一份协议了!

HTTP—这估计是你看的最仔细的一份协议了! 2017-10-20 Java联盟 ? 温馨提示:本文干货,建议保存 1.HTTP协议 HTML 是构建网页的语言,HTTP 是网页的传输协议,两者结合,构成了 WEB 应用开发的基础. HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议,设计 HTTP 的最初目的是为了提供一种发布和接收 HTML 页面的方法. ? 默认HTTP的端口号为80,HTTPS的端口号为443. http

uvalive 6396 数论 世界决赛的题

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=589&problem=4407&mosmsg=Submission+received+with+ID+1528513 Factors The fundamental theorem of arithmetic states that every integer

欧拉计划(1~3)ps:以后看题一定要认真

那天的题挺简单的 下面来看下 No1 If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000. //project euler num1 #include <stdio.h> #inc

UVaLive 6591 &amp;&amp; Gym 100299L Bus (水题)

题意:略. 析:不解释,水题. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <set>

UVaLive 6698 Sightseeing Bus Drivers (水题,贪心)

题意:n个工人,有n件工作a,n件工作b,每个工人干一件a和一件b,a[i] ,b[i]代表工作时间,如果a[i]+b[j]>t,则老板要额外付钱a[i]+b[j]-t;现在要求老板付钱最少: 析:贪心策略,让大的和小的搭配,小的和大的搭配,是最优的. #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include &l

UVALive 7511 L - Multiplication Table 数学模拟题,暴力

给定一副表,问其是否合法. 思路:当全部是?的时候,是合法的. 如果不是,那么,就找到一个数字,把它拆成若干个a*b的形式,去判断其它点是否合法即可. 拆分数字的时候,只需要枚举到sqrt(n),因为肯定是两个小于sqrt n的数相乘得到的结果. 比如6=1*6 6=2*3 注意分解后,考虑调换顺序是否合法即可. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath>

关于自己做题不仔细的检讨(系列)

1.num=num+(lower_bound(a+i+1,a+n,a[i]+mid)-(a+i+1));与num=num+lower_bound(a+i+1,a+n,a[i]+mid)-(a+i+1); 在此我深刻践踏自己的傻逼行为,我tm当时为什么不用屁股想想num+lower_bound(a+i+1,a+n,a[i]+mid)有没有意义

【刷题】【单调栈】音乐会的等待

N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. 写一个程序计算出有多少对人可以互相看见. 重点: (1)看题要仔细 (2)不开long long 见祖宗 解法神奇 #include<cstdio> #include<cstdlib> #include<stack> #define ll long long using namesp

明天会更好!!!

本人最近zz,有点忧伤. 分析一下:1.知道做一道题后太兴奋,导致打代码的时候犯智障错误. 2.考试时间分配不当,做完第一个题就没时间了.但题目的难度并不一定是按照顺序递增的. 3.看题不仔细,忽略重要条件. 4.想到了一些细节问题,但是由于懒惰并不想改,导致大部分点过不去. 5.做完之后并没有仔细检查文件名而是去玩扫雷. 6.莫名紧张,喜欢东张西望. 7.思想僵化. 改进的办法:1.知道一道题做法后先深呼吸,把题目的思路明确的写在纸上,再开始打代码. 2.根据题目的难度选择做题顺序.但我估计自