Rock, Paper, Scissors - 每天一把CF - 20201022

本文介绍了Codeforces的一道关于石头剪刀布的游戏问题,分析了求解小红赢得比赛的最小和最大轮数的思路,讨论了行动顺序对结果的影响,并提供了代码实现和官方题解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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({
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值