HDU ACM 5246スーパーサイヤACMer欲張り


分析:まず各挑戦者の戦闘力を昇順に並べ替え、次にmに最も近いmより小さい挑戦者の戦闘力を見つけ、そこから、後ろの各挑戦者を処理し、できるだけ100度戦闘力を向上させた後、次の挑戦者の戦闘力に等しいようにする.戦闘力を奮い立たせても勝てなければだめだ.そうしないと等しくなる.
#include<iostream>
#include<algorithm>
using namespace std;

int main()      
{
	int T,t,n,m,k,i;
	__int64 a[10005];
	__int64 cnt;
	int tmp;
	bool fg;

	cin>>T;
	t=0;
	while(T--)
	{
		cin>>n>>m>>k;
		for(i=0;i<n;i++)
			scanf("%I64d",&a[i]);

		sort(a,a+n);           //      
		cout<<"Case #"<<++t<<":"<<endl;
		if(a[0]>m)
		{
			puts("madan!");
			continue;
		}
		if(a[n-1]<=m)
		{
			puts("why am I so diao?");
			continue;
		}
		fg=true;
		cnt=m;
		for(i=0;i<n;i++)
			if(a[i]>m)
			{
				cnt=a[i-1];
				tmp=i;
				break;
			}
		for(i=tmp;i<n;i++)
			if(cnt+k<a[i])
			{
				fg=false;
				break;
			}
			else
			{
				cnt=a[i];
				if(k>0) k--;
			}
		if(fg) puts("why am I so diao?");
		else puts("madan!");
	}
    return 0;      
}