原题链接: https://codeforces.com/contest/1426/problem/E
测试样例
input
2
0 1 1
1 1 0
output
0 1
input
15
5 5 5
5 5 5
output
0 15
input
3
0 0 3
3 0 0
output
3 3
input
686
479 178 29
11 145 530
output
22 334
input
319
10 53 256
182 103 34
output
119 226
Note
In the first example, Alice will not win any rounds if she shows scissors and then paper and Bob shows rock and then scissors. In the best outcome, Alice will win one round if she shows paper and then scissors, and Bob shows rock and then scissors.
In the second example, Alice will not win any rounds if Bob shows the same things as Alice each round.
In the third example, Alice always shows paper and Bob always shows rock so Alice will win all three rounds anyway.
题意: Alice和Bob进行石头剪刀布游戏,其中进行了次回合,Alice出了
次石头,
次剪刀,
次布。Bob出了
次石头,
次剪刀,
次布。显然有一个事实就是
。问Alice赢得最少回合数和赢得最多回合数。
解题思路: 求最多回合数自然简单,考虑Alice赢的就行。自然是。 那么关键是求赢得最小回合数,你可能会想了,让对手赢得最多,再用
减去这个值不就行了吗?这自然是错误的,因为还存在平局,如果我们以这种思路的话,我们是需要剔除平局的。那么我们怎么来衡量这个比重呢?其实我暂时也还不知道,贴一下大佬代码。之后补最小值解决方案。
AC代码
/*
*
*/
//POJ不支持
//i为循环变量,a为初始值,n为界限值,递增
//i为循环变量, a为初始值,n为界限值,递减。
using namespace std;
const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e5;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//
int n;
int a1,a2,a3;
int b1,b2,b3;
int main(){
//freopen("in.txt", "r", stdin);//提交的时候要注释掉
IOS;
while(cin>>n){
cin>>a1>>a2>>a3;
cin>>b1>>b2>>b3;
int maxx=min(a1,b2)+min(a2,b3)+min(a3,b1);//获取最大值。
int minn=n-(min(a2,b1+b2)+min(a3,b2+b3)+min(a1,b3+b1));
cout<<minn<<" "<<maxx<<endl;
}
return 0;
}