http://acm.hdu.edu.cn/showproblem.php?pid=5246
Problem Description 百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度。
所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发斗志,实力提升.
Input 输入包含多组数据(数据不超过500组)
Output 对于每组数据,先输出一行Case #i: (1≤i≤T)
Sample Input 2 5 11 3 15 13 10 9 8 5 11 3 8 9 10 13 16
Sample Output 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
Source |
可以采取这样的策略:
找出距离m值最近的那个位置,判断那个位置上的数+k是否大于后一个数,若否,退出循环
若是更新m以及k
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[600000];
int main()
{
ll t;
scanf("%lld",&t);
ll o=0;
while(t--)
{
++o;
ll flag=1;
ll n,m,k;
scanf("%lld%lld%lld",&n,&m,&k);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
ll s;
sort(a+1,a+n+1);
if(m<a[1])flag=0;
for(ll i=1;i<=n;i++){
if(m>=a[i])continue;
else{
s=a[i-1];//找到这个数;
}
if(s+k<a[i]){flag=0;break;}
m=a[i];
k--;
}
printf("Case #%d:\n",o);
//cout<<"Case #"<<o<<":"<<endl;
if(flag){
printf("why am I so diao?\n");
}
else{
printf("madan!\n");
}
}
}