第九届山东理工大学ACM网络编程擂台赛 正式赛 sdut4074博弈 - ldq的吃瓜比赛

题目链接
ldq的吃瓜比赛
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description

ldq 和 他的“好朋友”szq 开始了吃瓜比赛。现在有 n 个单位的瓜,两个人每次可以拿起 1 到 L 某个整数单位的瓜,拿了 k 单位的瓜后必须花 k 单位的时间吃掉手里的瓜才能继续拿瓜吃,直到瓜全都被吃完。而且 ldq和 szq 不能拿对方手里的瓜。假设拿瓜是可以在瞬间完成的。还假设 ldq 的反应速度总是比 szq 快,意思是:若两人在一瞬间内同时拿瓜,则必定是 ldq 先拿完瓜 szq 再拿瓜。
现在两人在比赛开始的瞬间同时拿瓜,且双方的目的都是吃到尽可能多的瓜,求 ldq 最多能吃多少瓜。
Input

本题有多组数据。
第一行一个整数 T 表示有 T 组数据。
接下来 T 行,每行两个整数分别表示 n, L
1<=T<=1000,1<=n,L<=1*10^18
Output

共 T 行,每行输出一个整数表示对应数据的答案。
Example Input

1
9 8
Example Output

8
Hint

ldq 在比赛开始后的瞬间拿走了 8 单位的瓜,这时无论 szq怎么拿都只能吃到不超过 1 单位的瓜。
如果 ldq 一开始拿的瓜不到 8 单位,szq 就会拿走其他所有瓜。
所以 ldq 最多能吃到 8 单位的瓜

输入数据可能会爆int,请用 long long 数据类型代替,读入输出请用%lld
Author

axuhongbo

思路:

这道题是一个中等难度的博弈题,比赛时
没想到有这么多人去做,其实有不少人
推的已经很接近了,但是就是欠点火候,
最后只有一个队过掉了这道题。
具体最优策略有两种,
一种是一个一个的拿,
另一种是一下子拿完L个,
具体使用哪种需要视情况而定。
注意使用long long 数据类型
当n<=L时,答案显然为n。  
当L<n<=2L时,答案显然为L。  
当n>2L时: 

ldq使用如下策略,使得不管szq如何决策,
ldq吃的数量总能>=ceil(n/2)  
 // 注ceil为向上取整
当szq手里还有瓜时,ldq拿1个瓜。
当szq手里没瓜时:
若n<=2L,拿L个。
否则拿1个瓜。
证明:考虑ldq最后一次拿瓜,
由于ldq总是11个拿,
所以szq一定手上没瓜,而且此时n<=2L。
最后ldq拿了L个瓜,szq只能拿n-L<=L个瓜,
所以ldq比szq多。

同样szq若使用如下策略,
总能>=floor(n/2) //floor为向下取整
当ldq手里瓜>=2时,szq拿1个瓜。
当ldq手里只有1个瓜时:
若n<=2L,拿L个。
否则拿1个瓜。
证明:与上述相似,考虑szq最后一次拿瓜,
由于szq总是11个拿,
所以ldq一定手上只有1个瓜,
而且此时n<=2L。最后szq拿了L个瓜,
ldq只能拿n-L<=L个瓜,所以ldq最多比szq多1。
所以答案为ceil(n/2)

code:

#include<stdio.h>
typedef long long LL;
//声明定义,替换long long 为 LL
int main()
{
  int T;
  scanf("%d",&T);
  while(T--)
  {
  LL n,L;
  scanf("%lld%lld",&n,&L);
  if(n<=L) printf("%lld\n",n);
  else if(n>L&&n<=2*L) printf("%lld\n",L);
  else printf("%lld\n",(LL)((n+1)/2));
  }
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值