暑期集训20190807 游戏(game)

 【问题描述】

小A 拿到了 n 个数,?1,?2,…,??;小 B 也拿到了 n 个数,?1,?2,…,??。他们比较了一下手上的数发现,?1+?2+⋯+??=?1+?2+⋯+??。他们决定玩一个游戏,这个游戏流程如下:

1. 检查是否满足??=??(1≤?≤?),如果满足,游戏结束
2. 小A选择一个正整数??,将其改变成??−1
3. 小B选择一个正整数??,将其改变成??−1
4. 一轮游戏结束(轮数 +1 ),返回 1 。
小A想让轮数尽可能多,而小 B 想让轮数尽可能少。
假设他们都采取了最优的策略,最后这个游戏能玩几轮呢?

【输入格式】
输入文件名为 game.in 。第一行, 两个数n表示小A和小B手上初始数的个数接下来n行,每行两个数??,??,含义如题目所示。

【输出格式】
输出文件名为 game.out 。
仅一行,1 个数,表示在双方策略都最优情况下游戏的轮数。
【样例输入】

1 2

3 2

【样例输出】

2

【数据规模】
对于30%的数据,1≤?,??,??≤10
对于60%的数据,1≤?≤103,1≤??,??≤106
对于100%的数据,1≤?≤106,1≤??,??≤109

 

说个结论:最终情况为除了一个ai与bi均等于最小的小于ai的bi外,其余均为0。

因此记录小于ai的最小的bi,在∑ai(∑bi)中减去此值即可。

#include <bits/stdc++.h>
#define maxn 1000000001 using namespace std; int n; long long rslt=0, minb=maxn; int main(){ freopen("game.in", "r", stdin); freopen("game.out", "w", stdout); scanf("%d", &n); int t1, t2; for(int i=0; i<n; i++){ scanf("%d%d", &t1, &t2); rslt += 1ll * t1; if(t1 > t2){ if(t2 < minb) minb = t2; } } if(minb == maxn){ printf("0"); return 0; } rslt -= minb; printf("%lld", rslt); return 0; }

转载于:https://www.cnblogs.com/miserweyte/p/11348910.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值