题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5246
分析:贪心思想。我们先把每个挑战者按战斗力升序排序,然后找出离m最近的小于m的挑战者的战斗力x,赋初值cnt=x,并纪录该挑战者的下标tmp,然后从i=tmp开始遍历,对于后面的每一个挑战者,其战斗力为a[i],如果cnt+k<a[i],那么就说明百小度不能战胜它,标记flag为false跳出循环输出即可;否则,更新cnt的值为a[i],同时对于k>0时k--,直至遍历所以的挑战者,如果flag的值为true,就说明百小度可以战胜所有的挑战者。
实现代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
long long a[10010];
int main()
{
int t,T=1,n,m,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0; i<n; i++)
scanf("%lld",&a[i]);
printf("Case #%d:\n",T++);
sort(a,a+n);
if(a[0]>m)
{
puts("madan!");
continue;
}
if(a[n-1]<=m)
{
puts("why am I so diao?");
continue;
}
long long cnt=m;
int tmp;
bool flag=true;
for(int i=0;i<n;i++)
if(a[i]>m)
{
cnt=a[i-1];
tmp=i;
break;
}
for(int i=tmp; i<n; i++)
{
if(cnt+k<a[i])
{
flag=false;
break;
}
else
{
cnt=a[i];
if(k>0) k--;
}
}
if(flag) puts("why am I so diao?");
else puts("madan!");
}
return 0;
}