Number Game(数字游戏)

Number Game
爱丽丝和鲍勃正在玩游戏。它们具有正整数数组一个尺寸n.
在开始游戏之前,爱丽丝选择一个整数千≥0.游戏持续k阶段,阶段的编号从1自k.在我-th 阶段,Alice 必须从数组中删除小于或等于 的元素k−i+1.之后,如果数组不为空,Bob 必须添加k−i+1到数组的任意元素。请注意,爱丽丝的移动和鲍勃的移动都是游戏同一阶段的两个部分。如果爱丽丝在某个阶段无法删除元素,她就输了。如果k-第一阶段结束,爱丽丝还没有输,她赢了。
您的任务是确定k这样,如果两个玩家都发挥最佳状态,爱丽丝可以获胜。鲍勃对阵爱丽丝,所以如果可能的话,他试图让她输掉比赛。

输入
第一行包含单个整数t (1≤吨≤100) — 测试用例的数量。
每个测试用例的第一行包含一个整数n (1≤n≤100) — 数组的大小一个.
第二行包含n整数a1,a2,a3…an (1≤ai≤n).

输出
对于每个测试用例,打印一个整数 — 最大值k这样,如果两个玩家都发挥最佳状态,爱丽丝可以获胜。

Example
inputCopy
4
3
1 1 2
4
4 4 4 4
1
1
5
1 3 2 1 1
outputCopy
2
0
1
3

每次寻找第一个大于等于k-i+1的值并删除,每次把k-i+1加到最小值上面。

#include<bits/stdc++.h>
using namespace std;

int main()
{

	int t,n;
	cin>>t;
	while(t--)
	{
		multiset<int>l;
		cin>>n;
		for(int i=0; i<n; i++)
		{
			int a;
			cin>>a;
			l.insert(a);
		}

		if(n==1&&*l.begin()==1)
		{
			cout<<"1"<<'\n';
			continue;
		}
		int s=0;
		for(int k=1; k<=n; k++)
		{
			multiset<int> g=l;
			int ok=-1;
			for(int i=1; i<=k; i++)
			{
				int f=-1;
				for(int c:g)
					if(c<=k-i+1) f=c;
					else break;

				if(f==-1)
				{
					ok=1;
					break;
				}

				multiset<int>::iterator pos=g.lower_bound(f);
				g.erase(pos);
				int b=*g.begin();
				g.erase(g.begin());
				g.insert(b+k-i+1);
			}
			if(ok==1) break;
			s=k;
		}
		cout<<s<<'\n';
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个基于 NumPy 的数独游戏生成和验证程序。程序分为三个部分:生成数独游戏、检查数独游戏是否合法、提示用户输入数字。 首先,`generate_game`函数生成一个 9x9 的数独游戏,其中随机填充60%的数字。生成的游戏通过 NumPy 数组表示,并返回。 其次,`check_game`函数检查数独游戏是否合法。对于每个空格,检查该行、该列和该宫是否有重复数字。如果有重复数字,则返回 False,否则返回 True。 最后,`input_number`函数提示用户输入数字,并将输入的数字填入相应的位置。如果输入的数字不是 1-9 的整数或者 0,则要求用户重新输入。 在主程序中,首先生成数独游戏并打印出来,然后不断循环提示用户输入数字,直到用户输入的数独游戏合法为止。如果用户输入的数独游戏合法,则打印出“恭喜您,游戏结束!”并结束程序。 注意,代码中存在缩进错误,正确的代码应该是这样的: ``` import numpy as np import random def generate_game(): """ 生成数独游戏 """ game = np.zeros((9, 9), dtype=int) for i in range(9): for j in range(9): if random.random() < 0.6: game[i][j] = random.randint(1, 9) return game def check_game(game): """ 检查数独游戏是否合法 """ for i in range(9): for j in range(9): if game[i][j] == 0: return False for k in range(9): if k != i and game[k][j] == game[i][j]: return False if k != j and game[i][k] == game[i][j]: return False if k != (i % 3 * 3 + j % 3) and game[i // 3 * 3 + k // 3][j // 3 * 3 + k % 3] == game[i][j]: return False return True def input_number(game, i, j): """ 提示用户输入数字 """ while True: number = input("请输入数字(1-9),输入0表示清空:") if number.isdigit(): number = int(number) if number >= 0 and number <= 9: break game[i][j] = number def main(): """ 主程序 """ game = generate_game() while not check_game(game): game = generate_game() print(game) while True: i = int(input("请输入行号(1-9):")) - 1 j = int(input("请输入列号(1-9):")) - 1 input_number(game, i, j) print(game) if check_game(game): print("恭喜您,游戏结束!") break if __name__ == "__main__": main() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值