题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5246
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
解题思路:先排序,在采用贪心的方法,先给百小度找到合适的初始战斗力,找到比初始战斗力上限小的中最大的来打,并将初始战斗力和他设置成相同的即可。
再将战斗力提升,打比自己小的中最大的,依次下去,只要能够把最大的打败,剩下的就轻松搞定~~~
详见代码。
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; __int64 a[10010]; int main() { int t; int f=1; scanf("%d",&t); while (t--) { __int64 n,m,k; int i; scanf("%I64d%I64d%I64d",&n,&m,&k); for (int i=1; i<=n; i++) { scanf("%I64d",&a[i]); } printf ("Case #%d:\n",f++); sort(a+1,a+n+1); if (a[1]>m) { printf ("madan!\n"); continue; } if (a[n]<=m) { printf ("why am I so diao?\n"); continue; } __int64 power=0; int flag=0; for (i=2; i<=n; i++) { if (flag==0) { if (a[i]>m) { power=a[i-1]; flag=1; if (power+k<a[i]) break; } continue; } if (power+k<a[i]) { power=a[i-1]; k--; if (power+k<a[i]) break; } } if (i>n) printf ("why am I so diao?\n"); else printf ("madan!\n"); } return 0; }