2020-10-22
要开始准备按专题做了
题目
原题链接:https://codeforces.com/problemset/problem/1426/E
思路
翻车题。。
题目大意:小红和小明玩石头剪刀布,我们知道小红总共分别出了剪刀,石头和布a1,a2,a3次,小明分别出了b1,b2,b3次,要我们求小红赢的最小和最大轮数。
思路:最大轮数基本有手就行,赢的情况只能是拿自己的石头碰对面的剪刀,轮数是两者较小值,其他同理,所以最后代码是
int ans2 = min(a[0], b[1]) + min(a[1], b[2]) + min(a[2], b[0]);
再思考最小轮数,明显我们要去追求输和和局,而且最后我们手上一定只剩下一种选择,若是有两种选择,则其中一种一定可以和对面碰掉(我两种选择可以选择的输和和局已经覆盖了剪刀石头布三个选项了)。
走到这也不难,我一开始想的是要么先输再和,要么先和再输,最后答案就是手上唯一剩的那种选择的个数。
然鹅,他不是这样子的。看了官方题解,里面提到每一种选择(每个数都有输和和两个选择,总共三个数)都会导致不同的结果,所以要去枚举每一种行动的可能性,然后再选出最小值。即下面六种操作的可能性。(一个全排列)
vector<pair<int, int> > ord;
ord.pb({
0, 0 });//pb push_back
ord.pb({
0, 2 });
ord.pb({
1, 1 });
ord.pb({
1, 0 });
ord.pb({
2, 2 });
ord.pb({