题目链接:点击打开链接
题目的意思就是一个人具有初始的战斗力为0~m,第i次攻击一个战斗力和自己相同的人,则可以将自己的攻击力提升0 ~ k - i + 1点,而一旦某次战胜别人,则攻击力就不再增加,问是否存在某种攻击顺序使得能够打败所有的敌人。
我们只需每次贪心找到攻击力提升范围内的最大的敌人作为自己的攻击力即可。如果某次不能覆盖到新的对手,则攻击力不能再提升,此时看是否攻击力超过最大攻击力即可。
脑残了还用了二分查找..
#include <iostream>
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
#define LL long long
#define N 10010
LL num[N];
int main()
{
int n,cas,T;
LL t,m,k;
cas = 1;
cin>>T;
while(T--){
scanf("%d%I64d%I64d",&n,&m,&k);
LL maxx;
printf("Case #%d:\n",cas++);
for(int i = 0;i < n;i++){
scanf("%I64d",&t);
num[i] = t;
}
sort(num,num+n);
int l,r,mid,pre = -1;
LL flag = m;
bool j;
int pos;
for(int i = 0;i < k;i++){
pos = lower_bound(num,num+n,flag) - num;
if(num[pos] > flag||pos == n) pos--;
if(pos == pre) {
j = false;
break;
}
flag = num[pos] + k - i;
if(flag >= num[n-1]){
j = true;
break;
}
pre = pos;
}
if(j){
cout<<"why am I so diao?"<<endl;
}
else{
cout<<"madan!"<<endl;
}
}
return 0;
}