题目描述
为了消磨时光,奶牛 Bessie 和她的朋友 Elsie 喜欢玩一种她们在农业展览会上看到的游戏。
游戏准备阶段,Bessie 在桌子上放置三个倒置的坚果壳,1号坚果壳放在位置1,2号坚果壳放在位置2,3号坚果壳放在位置3。并在其中一个坚果壳下面藏了一块小的鹅卵石(至少她希望这是一块鹅卵石——她在一块牧场的地上找到的)。
随后 Bessie 会两两调换坚果壳,鹅卵石会随着坚果壳一起移动,同时 Elsie 试着去猜鹅卵石的位置。
奶牛们在农业展览会上看到的这个游戏的标准形式是玩家可以看到鹅卵石初始的位置,然后要求玩家猜所有交换完成之后鹅卵石最终的位置。
然而,现在奶牛们想要去进行这样一种玩法,Elsie 不知道鹅卵石的初始位置,同时她可以在每一次交换之后猜一下鹅卵石的位置。
Bessie 知道正确答案,在游戏结束后会给 Elsie 一个分数,等于她猜对的次数。
给定所有的交换和 Elsie 的猜测,但是不给出鹅卵石的初始位置,请求出 Elsie 最高可能获得的分数。
输入格式
输入的第一行包含一个整数 N,为交换的次数。
以下 N 行每行描述了游戏的一个回合,包含三个整数 a、b 和 g,表示 Bessie 交换了位置 a和 b 的坚果壳,然后 Elsie 猜的是位置 g。
所有这三个数均为 1、2、3之一,并且 a≠b。
输出格式
输出 Elsie 可以得到的最高分数。
数据范围
1≤N≤100
输入样例:
3
1 2 1
3 2 1
1 3 1
输出样例:
2
样例解释
在这个例子中,Elsie 最多可以获得 2 分。
如果鹅卵石开始时位于坚果壳 1下面,那么她猜中了一次(最后一次)。
如果鹅卵石开始时位于坚果壳 2下面,那么她猜中了两次(开始两次)。
如果鹅卵石开始时位于坚果壳 3下面,那么她没有猜对任何一次。
题解
#include <iostream>
#include <algorithm>
using namespace std;
int cup[4] = {0,1,2,3};//cup表示的是第i个位置上放的是哪个杯子,数组里的123代表的是第123个杯子
int res[4];//记录答案
int main(){
int n,a,b,g;
cin >> n;
while(n--){
cin >> a >> b >> g ;
swap(cup[a],cup[b]);//模拟交换杯子的过程
res[cup[g]]++;//猜测第g个位置上的杯子,如果在初始的时候坚果在此时第g个位置上的杯子里,那么该杯子加一分。
}
cout << max(max(res[1],res[2]),res[3]);//输出最大可能的分数
return 0;
}
总的来说就是初始时第i个杯子中有坚果,在猜测时第g个位置上的杯子如果是第i个杯子(杯子和坚果一起移动),那么第i个杯子的得分加一。 每一次猜对同时有另外两种情况的没猜对。
文字说一下第一次交换和猜测的过程吧,样例第二行 1 2 1代表交换第一二个位置上的杯子,然后猜测第一个位置上的杯子是否有坚果。
假设初始的时候坚果在第一个杯子里,此时他被交换到第二个位置上,猜测错误,第一个杯子的得分res[1]不加分;
假设初始的时候坚果在第二个杯子里,此时他被交换到第一个位置上,猜测正确,第二个杯子的得分res[2]也就是res[cup[g]]加一分。(这里的g = 1,cup[g] = 2,意思是猜测的第一个位置上是第二个杯子,因为初始的时候坚果就在第二个杯子里,坚果跟着杯子一起动,所以第二个杯子加一分)
假设初始的时候坚果在第三个杯子里,此时他没有变化,猜的是第一个位置上的杯子,他是2号杯,所以三号杯子不加分。
最后写完才发现把鹅卵石写成了坚果,坚果壳写成了杯子,但是影响不大- -、