hdu5246 超级赛亚ACMer (百度之星初赛)(模拟)
题意:一个初始战斗力上限为m的选手,和战斗力相同的人战斗后,该选手最多可提升k点战斗力,每提升一次k值减一;和战斗力低于他的人战斗,战斗力不变;
n名挑战者,给出每名挑战者的战斗力,问他是否能将挑战者全部打败;
思路:先sort,然后找到和他初始战斗力上限最接近的且比他弱的战斗力,然后根据下一个比他强的人提升战斗力,看是否能打败最后一个;
比赛的时候思路完全正确,然后TLE了。补题是终于发现是for里面漏了一个条件,考虑的不仔细。弱!!!
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f __int64 a[50010],m,k; __int64 temp,shu; int main() { int t,i,j,n,cas,point,cc,c1,flag,pos; scanf("%d",&t); for(cas=1;cas<=t;cas++) { scanf("%d%I64d%I64d",&n,&m,&k); memset(a,0,sizeof(a)); temp=k*(k+1)/2; for(i=0;i<n;i++) { scanf("%I64d",&a[i]); } sort(a,a+n); a[n]=INF; printf("Case #%d:\n",cas); if(a[0]>m) { printf("madan!\n"); continue; } if(a[n-1]<=m) { printf("why am I so diao?\n"); continue; } for(i=0;i<n;i++) { if(a[i]>m) { pos=i;shu=a[pos-1]; break; } } pos--; flag=1; while(pos!=(n-1)) { if(k==0||(shu+k)<a[pos+1]&&(pos+1)<n) { flag=0; break; } for(i=pos+1;a[i]<=(shu+k)&&i!=n;i++)//因为i!=n没加,a[n]=INF似乎没起到作用,纠结,没能够AC { } pos=i-1; shu=a[pos]; if(k>0) k--; } if(flag) { printf("why am I so diao?\n"); } else printf("madan!\n"); } }
有些梦想现在不去实现,以后就再也没机会了!!