P1190排队接水
这是2010年普及组第二题(话说我怎么只做普及组的题?因为太蒻).
这道题可以用搜索或者模拟来做,果断编了几组例子去分析来模拟,利用了贪心的思想得出:每次比较每个水龙头的空闲时间点,谁早就放到谁那里,最后求时间最长的水龙头需要花多长时间。但是在这个过程中不知为何,中途竟然死循环了。另外这个题交了一遍就AC了。
1.写比较大小循环更替时要慎重,选好临界点
2.当程序出现无输出或RE时,一点点输出,精准排雷,实在不行就重新写
3.分析时一定多举例子分析
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<string> #include<cstring> #include<algorithm> #define MAXN 10010 using namespace std; int n,m; int a[MAXN]; int ing[MAXN];//当前水龙头结束的总时间 int main(){ scanf("%d",&n); scanf("%d",&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<=m;i++){ ing[i]=a[i]; //cout<<ing[i]<<endl; } ing[0]=9999999; int maxx=0; for(int i=m+1;i<=n;i++){//还剩下m+1~n人没接水 for(int j=1;j<=m;j++){ if(ing[j]<ing[maxx]){ maxx=j; } } ing[maxx]+=a[i]; } int time=1; for(int i=1;i<=m;i++){ if(ing[i]>time){ time=ing[i]; } } cout<<time; return 0; }
待到oi十一月,我花开后百花杀。