列表

详情


NC230369. Awa玩游戏

描述

Awa正在和他的朋友们玩游戏!

游戏规则如下:

参与游戏的人(包括Awa)有N位,而牌桌上有M张牌(),编号为1,2,3,...,M

每局游戏开始时,每人将被分到一张牌,显然这些牌各不相同,每人只知道自己手中的牌的编号以及桌上牌的总数。

游戏将进行若干轮,每一轮每人分别根据已有信息判断当前场上有多少人手中的牌的编号比自己的小,如果可以成功判断,则发出声明,如果判断正确则该玩家退出游戏(离场),直到所有玩家全部退出后游戏结束,优先退出者将获得更高的位次(同一轮中退出的将并列排名)。

Awa和他的朋友们都很聪明,每个人只在绝对把握的情况下发出声明

现在Awa想知道,他会在第几轮退出?

输入描述

第一行一个正整数T,表示游戏进行了T

对于每次游戏,第一行输入两个正整数N,M,表示该局中参与游戏的人数,以及牌的总数,第二行输入N个数,其中第一个数为Awa的手牌编号,之后为其他人的手牌编号。

输出描述

T行,每行一个正整数X,表示Awa会在第X轮退出游戏。

示例1

输入:

1
3 3
1 2 3

输出:

1

示例2

输入:

1
3 4
2 3 4

输出:

2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 721ms, 内存消耗: 784K, 提交时间: 2023-01-05 19:17:08

#include<iostream>
#include<algorithm>
using namespace std;
int a[100010];
int main()
{
	int T;
	scanf("%d",&T);
	int N, M, awanum;
	while (T--) {
		scanf("%d %d",&N,&M);
		for (int i = 1; i <= N; i++) 
			scanf("%d",&a[i]);
		//awa手牌号码
		awanum = a[1];
		sort(a + 1, a + 1 + N);
		//回合数
		int round = 1;
		int min = 1, max = M;
		int left = 1, right = N;
		while (left < right) {
			if (max - min == right - left)
				break;
			if (a[left] == min) {
				if (awanum == a[left]) break;
				left++;
			}
			if (a[right] == max)
			{
				if (awanum == a[right]) break;
				right--;
			}
			round++;
			min++;
			max--;
		}
		cout << round << endl;
	}
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 615ms, 内存消耗: 752K, 提交时间: 2022-12-30 17:06:52

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
	int t, m , n,p[100010];
	cin >> t;
	while(t--)
	{
		cin >> n >> m;
		for(int i = 1; i <= n; i++) scanf("%d",&p[i]);
		int l = 1, r = m, ans = 1, x = 1, y = n, z = p[1];
		sort(p + 1, p + n + 1);
		while(x < y)
		{
			if(y - x == r - l) break;
			if(p[x] == l)
			{
				if(l == z) break;
				x++;
			}
			if(p[y] == r)
			{
				if(r == z) break;
				y--;
			}
			l ++, r--;
			ans++;
		}
		cout << ans << endl;
	}
	return 0;
}

上一题