标签:二分
2 5 11 3 15 13 10 9 8 5 11 3 8 9 10 13 16
Case #1: why am I so diao? Case #2: madan!Hint第一组样例解释 5个ACMer,初始战斗力选择范围是[0,11],接下来每场战斗力提升上限是3,2,1,0,0,...,0 百小度首先使得自己的初始战斗力为10,打败战斗力为10的第一个ACMer, 然后选择战斗力提升3,变成13,打败战斗力为13的第二个ACMer, 然后选择战斗力提升2,变成15,打败战斗力为15的第三个ACMer,之后再以任意顺序打败剩下的ACMer
这题是道二分题,先按大小排序,然后每次查找第一个大于当前战斗力的值的位置j,然后把a[j-1]+k变为新的力量值(如果j是1的话就break),当k=0但是当前战斗力还是比最大值小的时候就说明不可能战胜了break;
ps:从大神那里学会了如果在int main()函数中用到超过10^9的数,要在#define inf 100000000000后加上LL,即#define inf 100000000000LL
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<algorithm> #define inf 10000000000000LL using namespace std; __int64 a[10006]; int main() { int T,m,n,i,j,k,num1=0,flag; __int64 liqi,minx,maxx; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); num1++; maxx=0;minx=inf; for(i=1;i<=n;i++){ scanf("%I64d",&a[i]); if(a[i]>maxx)maxx=a[i]; if(a[i]<minx)minx=a[i]; } printf("Case #%d:\n",num1); if(m>=maxx){ printf("why am I so diao?\n");continue; } if(m<minx){ printf("madan!\n");continue; } sort(a+1,a+n+1); flag=0; liqi=m; while(1) { //printf("%d\n",liqi); if(liqi>=maxx){ flag=1;break; } if(n==1)break; if(k==0)break; j=upper_bound(a+1,a+1+n,liqi)-a; if(j==1)break; liqi=a[j-1]+k;k--; for(i=j-1;i<=n-1;i++){ a[i]=a[i+1]; } n--; } if(flag){ printf("why am I so diao?\n");continue; } else printf("madan!\n");continue; } }
标签:二分
原文地址:http://blog.csdn.net/kirito_acmer/article/details/46425353