【题目描述】一桌人在吃烧烤,其中有 2 个人不小心将酱汁沾到脸上,大家都能看到别人的 脸但不知道自己的。出于礼貌各人都默不吱声,也不敢露怯去摸自个儿的脸。这时候女招待 进来说:“这里有人脸脏了,请他自己擦了。”连说两次,这 2 个人明白过来,把自个儿的脏 脸擦了。(所有人都是绝对理性且默认自己不是脏脸。如果餐桌上有人的脸脏了,女仆会一 直提醒)
【输入】为多组测试样例。第一行输入 T,代表有 T 组测试样例。1<=T<=10
接下来 T 行每行输入 n,m。代表桌上一共有 n 个人,其中 m 个人脸脏了。 1<=m<=n<=10^9
【输出】每行样例输出一个数代表女招待最少需要喊几次才能使桌上没有脏脸的人。
【输入样例 1】
2
3 1
1 1
【输出样例 1】
2
1
【解题思路】 这题弄清楚思路就好了,代码非常简单。
首先先看一个脏脸的情况,无论场上一共有几个人,以那个脏脸的人的视角看,是看不 到有人脸脏了的,所以当女招待来提醒的时候就能意识到是自己脸脏了。
再看两人脸脏的情况。无论在场的一共有几个人,以两个脏脸的人的视角看都只能看到 一个脏脸。又因为每个人是默认自己不是脏脸,因此当女招待喊第一次的时候两个人都不会 擦脸。当女招待喊第二次的时候两个脏脸的人会发现对方没有擦脸。我们以其中一个脏脸的 人的视角来讲:我看到另一个人脸脏了,女招待喊了一次,但他没擦掉脸,如果我的脸没脏 的话他不可能意识不到自己脸脏了,所以我的脸也必定是脏的。
同理当有 3 个脏脸的时候,以其中一个脏脸的人的视角为主:我看到有两个人脸脏了, 但是女招待喊了两次他们都没擦掉自己的脸,(因为只有两个脏脸的时候,喊两次他们就能 意识到自己脸脏)因此我必定是脏脸。 我们很容易就能得出当 m 个人脏脸的时候女招待需要喊 m 次,直接输出 m 即可,结果 与 n 无关。
#include <iostream>
using namespace std;
int main()
{
int t = 0;
int n, m;
cin >> t;
while (t--) {
cin >> n>>m;
cout << m << endl;
}
return 0;
}