超级赛亚ACMer

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3999    Accepted Submission(s): 1086

Problem Description
百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度。
所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发斗志,实力提升.

具体来说,就是百小度现在要接受一些ACMer的挑战了,这些ACMer有n个人,第i个人的战斗力是a[i]。


百小度接下来可以自主安排与这n个ACMer的PK顺序,他要想在PK赛中赢过另外一个ACMer,就必须使得自己的战斗力不小于对方(平局情况他会按照百小度字典上的规则把自己排在第一).

如果百小度的战斗力大于对方,那么百小度就会轻易获胜,得不到锻炼并且骄傲起来,他以后的战斗力将保持在这个值,再也不会发生改变。
如果百小度的战斗力等于对方,那么百小度在获胜的同时也会感到很吃力,但是这会激发百小度的斗志,使得他刻苦刷题,在下场PK赛之前,战斗力最多提升k点(即可以提升0~k点任意值).

k是百小度的潜力提升上限,会被给定一个初始值,这个潜力提升上限k在后面的比赛中会下降.

每战胜一个ACMer,这个潜力上限k将减少1(因为超级赛亚人百小度也会感到累),但k最低只会减少到0,即不会出现战斗力下降的情况。也就是第一次比赛如果激发了百小度的斗志,他能把战斗力提升0~k的任一值,如果第二次比赛继续被激发斗志,他能在第一次提升后的基础上,把战斗力再提升0 ~ max(0,k−1),依次类推…

m是百小度的初始战斗力上限,也就是百小度第一次进行PK赛的时候,可以选择0~m的任意一个值作为他的战斗力.

现在希望你编写程序,判断一下百小度是否战胜所有的ACMer.

 
Input
输入包含多组数据(数据不超过500组)

第一行一个整数T,表示T组数据

对于每组数据,第一行包括三个整数n,m,k(1≤n≤104,1≤m,k≤108)

第二行包括n个正整数,表示彪形大汉的战斗力(战斗力为不超过1012的正整数)

 
Output
对于每组数据,先输出一行Case #i: (1≤i≤T)

如果百小度能打败所有的ACMer,再输出"why am I so diao?"

否则再输出"madan!"

 
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
2015年百度之星程序设计大赛 - 初赛(1)

第一个代码是开始的错误代码,理解错了题意,以为每一次激发战斗力都必须是前一次的激发战斗力-1,

应该这样理解:第一次激发的战斗力 在 0~k-1 中任意选一个

第二次激发的战斗力 在 0~k-2 中任意选一个

第三次激发的战斗力 在 0~k-3 中任意选一个

下面是理解错误并且超时的代码

/*
此代码过不了!!!!!!!
虽然这是个必定超时的代码,留着做一个思考过程印记 首先我想的是:
如果有能力把战斗力最大的壮汉给干掉,
那么就一定能战胜所有。我们要在战斗力k 范围里面选一个值作为初始战斗力
一定是要选择最终能发育到打败最大的壮汉的。
而得到发育的条件是要和 某些壮汉战斗力一样所以初始战斗力值我们要选择和一个壮汉一样的。
然后不断的得到发育的机会,最终大于等于最大的壮汉战斗力。
而一旦连最大的都能打败,其余的一律打败那我们如何找到这个“恰好”的 初始值呢?
--------------------思考--------------------------
结果当然是用二分了 */#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
typedef long long LL;
LL p[N];
unordered_map<LL,int> mp,st;
int k,n;bool check(int m)
{int it=m;int pos=mp[m];int t=k;while(t>=0&&m<p[n]){m=m+t;if(!st[m])  return false;t--;}return  true;
}int main()
{int T;cin>>T;while(T--){mp.clear();st.clear();int m;cin>>n>>m>>k;for(int i=1;i<=n;i++)  //输入每个壮汉的战斗力 {cin>>p[i];st[p[i]]=1; }sort(p+1,p+1+n);//从0到m中选值做为战斗力 for(int i=1;i<=n;i++){if(p[i]<=m){mp[p[i]]=i;}}int l=0,r=m,ans=-1;while(l<=r){int mid=(l+r)>>1;if(check(mid)){r=mid-1;ans=mid;}else l=mid+1;}if(ans==-1) puts("madan!");else{//cout<<"ans is "<<ans<<endl;puts("why am I so diao?");}}return 0;
}

下面才是正确的思路:

用了 upper_bound 来找 比某值小的最大数的位置。

STL的二分法一定要学牢固

/*
这个思路是看了别人的:
我没想到的是----最优的初始战力,居然是直接找比最大战力k小的 最大战力的敌人这一步居然直接到位把最优初始战力给确定了。*/#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e4+10;
LL p[N];  //大汉的战斗力
int main()
{int T;scanf("%d",&T);for(int t=1;t<=T;t++){printf("Case #%d:\n",t);int n,m,k;scanf("%d%d%d",&n,&m,&k);for(int i=0;i<n;i++){scanf("%lld",&p[i]);}sort(p,p+n);if(m>=p[n-1]){puts("why am I so diao?");continue;}if(m<p[0]){puts("madan!");continue;}//首先找到最优的初始战斗力的位置(p[]中小于等于m的最大值)int pos=upper_bound(p,p+n,m)-p-1;/*第一次是在0到k之间取任意值 第二次就是在0到k-1之间取任意值第三次就是在0到k-2之间取任意值...... */ bool flag=false;for( ;k>0;k--) {int pos2=upper_bound(p,p+n,p[pos]+k)-p-1;if(pos2==n-1) //如果能击败最大的壮汉 {flag=true;break;}else if(pos2==pos) //p[pos]到p[pos]+k这一段之间没有能找到的pos2 {break;}else //能找到pos2 {pos=pos2;}}if(flag) puts("why am I so diao?");else puts("madan!");}return 0;
}

HDU 5246 超级赛亚ACMer 【贪心】【STL版本二分】相关推荐

  1. hdu 5246 超级赛亚ACMer

    百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度.
所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发斗志,实力提升. 具体来说,就是百小度现在要接 ...

  2. 【杭电oj】5246 - 超级赛亚ACMer(二分 贪心 STL)

    点击打开题目 超级赛亚ACMer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. 2015Astar百度之星初赛 1001 超级赛亚ACMer

    超级赛亚ACMer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. 2015年百度之星初赛(1) --- A 超级赛亚ACMer

    超级赛亚ACMer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem D ...

  5. hdu5246超级赛亚ACMer

    题意(中文题意直接粘吧)                             超级赛亚ACMer Problem Description   百小度是一个ACMer,也是一个超级赛亚人,每个ACM ...

  6. 【百度之星初赛】 超级赛亚ACMer(灵活题)

    百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度.
所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发斗志,实力提升. 具体来说,就是百小度现在要接 ...

  7. hdu5246---超级赛亚ACMer(贪心)

    Problem Description 百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度.
所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发斗志, ...

  8. hdu5246 超级赛亚ACMer

    Problem Description 百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度.
所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发斗志, ...

  9. [水]2015百度之星初赛第一场 超级赛亚ACMer

    Description 百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度.
所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发斗志,实力提升.
 具 ...

最新文章

  1. 无线网络会杀死固网? 不可能的事情
  2. 5.2.4 OS之缓冲区管理(单缓冲-双缓冲-循环缓冲-缓冲池)
  3. 代码执行-preg_replace
  4. 作业四-结队编程项目-四则运算
  5. js小技巧,收藏.作者:空军上将
  6. ABP架构学习系列二:ABP中配置的注册和初始化
  7. android反射改theme,全局修改默认字体,通过反射也能做到
  8. RK3288 USB触摸屏无法使用,需要添加PID和VID
  9. html背景图片半透明遮罩,巧用CSS cross-fade()实现背景图像半透明效果
  10. 李珣动态爱心代码教程
  11. 基于esp32的物联网设计
  12. 现场总线技术笔记——3、通用串行端口的数据通信(RS232、RS485)
  13. centos7 默认中文字体_centos7安装中文宋体
  14. IOC 之深入理解 Spring IoC
  15. python 实例解析--村长选举
  16. 有关于Mapreduce的读后感
  17. 小微企业都在用的一体化管理解决方案
  18. python实现QQ和微信刷屏
  19. 人脸识别损失函数梳理与分析/相关方法整理
  20. 你是真的“C”——详解函数递归+求解青蛙跳台阶问题

热门文章

  1. 超导系统与服务器断开,HT一7超导托卡马克总控系统的设计与实现.pdf
  2. 剑指offer_1:给你一根长度为n的绳子,把绳子剪成m段(m、n都是整数且m 1, n 1),m段绳子的长度依然是整数,求m段绳子的长度乘积最大为多少?  * 比如绳子长度为8,我们可以分成
  3. 分享实录 | 技术更迭视角下的游戏语音新玩法
  4. 元宇宙与虚拟现实(二)
  5. 南宁计算机学校排名,2021年南宁所有的中学排名,南宁最好的中学排名前十强
  6. 安东尼罗宾--激发你的无限潜能[连载]--15 16章
  7. 安霸s2l 的IPC项目--进展2
  8. 显示器测试软件 鲁大师,鲁大师怎么检测显示器 鲁大师有什么作用
  9. 0x00405cad指令引用的“0x00000000”内存。该内存不能为“read”
  10. 爬取起点中文网字体反爬取