P1413 坚果保龄球 题解

小邱

2021-02-11 15:11:04

Personal

[题目传送门](https://www.luogu.com.cn/problem/P1413) 由于一个坚果只能在一行上活动,不可以管其他行的事情,所以我们可以一行一行的处理 而在同一行的zombie只要有一个和begin的时间差60及以上,就要ans++ ## 上代码! ```cpp #include<bits/stdc++.h> using namespace std; int s1,s2,s3,s4,s5,s6,a[2000],b[2000],c[2000],d[2000],e[2000],f[2000];//s分别表示每行的zombie个数,abcdefg数组为每行的zombie时间 long long ans; bool cmd(int a,int b) { if(a<b) return 1; return 0; } int main() { int n,begin,i;//begin为60时间内的开始时间 scanf("%d",&n);//输入的n个数 for(i=0;i<n;i++) { int x,y; scanf("%d%d",&x,&y); if(x==1) { a[s1]=y; s1++; } else if(x==2) { b[s2]=y; s2++; } else if(x==3) { c[s3]=y; s3++; } else if(x==4) { d[s4]=y; s4++; } else if(x==5) { e[s5]=y; s5++; } else if(x==6) { f[s6]=y; s6++; } } sort(a,a+s1,cmd);//每行从小到大排,方便后面运算 sort(b,b+s2,cmd); sort(c,c+s3,cmd); sort(d,d+s4,cmd); sort(e,e+s5,cmd); sort(f,f+s6,cmd); begin=a[0];//让begin记录一下第一个60的开始点 if(s1) ans++;//就算都没有超过59也需要用一个球,可以理解成第一波60时间内也需要一个球,所以要提前+1 for(i=1;i<s1;i++) { if(a[i]-begin>59)//不可以是60,否则过不了 { ans++;//需要新增一个球 begin=a[i];//记录下一个60的开始点 } } //余下同理 begin=b[0]; if(s2) ans++; for(i=1;i<s2;i++) { if(b[i]-begin>59) { ans++; begin=b[i]; } } begin=c[0]; if(s3) ans++; for(i=1;i<s3;i++) { if(c[i]-begin>59) { ans++; begin=c[i]; } } begin=d[0]; if(s4) ans++; for(i=1;i<s4;i++) { if(d[i]-begin>59) { ans++; begin=d[i]; } } begin=e[0]; if(s5) ans++; for(i=1;i<s5;i++) { if(e[i]-begin>59) { ans++; begin=e[i]; } } begin=f[0]; if(s6) ans++; for(i=1;i<s6;i++) { if(f[i]-begin>59) { ans++; begin=f[i]; } } printf("%lld",ans); return 0; } ``` 最后,你猜我会些什么? [AC记录](https://www.luogu.com.cn/record/45147535)!