暑期集训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; }
posted @ 2019-08-13 22:01  mzWyt  阅读(239)  评论(0编辑  收藏  举报