题目链接:
题目大意:
给两个序列
A
A
和 ,长度均为
N
N
。小 和小
G
G
在玩一个游戏,小 先手,小
G
G
后手;
两个序列完全相等(即对于任意的
i
i
都有 )的时候游戏停止;
不然,小
T
T
选择一个 减
1
1
,小 选择一个
Bi
B
i
减
1
1
;
小
T
T
想使游戏进行的步数尽可能多,小 想使游戏进行的步数尽可能少;双方都采用最优策略,问最后游戏停止的时候经过了多少步?
题目保证
∑i=1NAi=∑i=1NBi
∑
i
=
1
N
A
i
=
∑
i
=
1
N
B
i
数据范围:
1≤N≤2×1050≤Ai,Bi≤109 1 ≤ N ≤ 2 × 10 5 0 ≤ A i , B i ≤ 10 9
解题思路:
A
A
和 相等的情况就不说了,主要考虑不想等的。
对于那些
Ai<Bi
A
i
<
B
i
的位置,小
T
T
显然会把这些 减到
0
0
;之后再去把那些 的位置的
Aj
A
j
减到
0
0
,小 是追不上的。
最后,小
T
T
才会被迫去减那些 的位置的
Ak
A
k
;
而且,游戏最后一定会停在某个
Ak>Bk
A
k
>
B
k
的位置上;且这个位置的
Bk
B
k
一定没有被减过!
可以拿这个例子模拟一下 :
A={4,3,2,2},B={3,2,2,4}
A
=
{
4
,
3
,
2
,
2
}
,
B
=
{
3
,
2
,
2
,
4
}
;
最后,问题的答案就是 ans=∑i=1NAi−min(Bi) a n s = ∑ i = 1 N A i − m i n ( B i ) 。
AC代码:
/**********************************************
*Author* :XzzF
*Created Time* : 2018/4/8 21:57:57
*Ended Time* : 2018/4/8 22:01:52
*********************************************/
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int inf = 1 << 30;
const LL INF = 1LL << 60;
int n;
int main()
{
while(scanf("%d", &n) != EOF)
{
LL MIN = INF;
LL sum = 0;
bool f = 1;
for(int i = 1; i <= n; i++) {
LL a, b;
scanf("%lld %lld", &a, &b);
sum += a;
if(a != b) f = 0;
if(a > b) MIN = min(MIN, b);
}
if(f == 1) printf("0\n");
else printf("%lld\n", sum - MIN);
}
return 0;
}