【题解】CF1956A

这道题其实挺有意思,多测里面还套了个多测。

思路就是用向量模拟删除过程,具体请看代码里的注释。

#include <bits/stdc++.h>
using namespace std;
int k,q,a[105];
void solve()
{
	int n;
	cin>>n;
	vector<int> ve;
	for(int i=1;i<=n;i++) ve.push_back(i);//把每个人放到向量里面
	while(!ve.size()<a[1]) //当还可以删除时
	{
		int cnt=1;
		/*
		 * cnt的作用
		 * 1. 把下标从0开始的ve与下标从1开始的a[]关联起来
		 * 2. vector的erase会自动补齐空位
		 * 如果没有cnt,第二次删除的则是错误的位置
		 * 所以用cnt统计目前删除了多少个数
		 * 
		 * (cnt为什么初始是1? 请看第一条)
		 *
		*/
		for(int i=1;i<=k;i++) 
			if(a[i]<=ve.size()) //当还可以删除时
			{
				ve.erase(ve.begin()+a[i]-cnt); //则删除,此时用上了cnt
				cnt++;//已删除+1
			}
	}
	cout<<ve.size()<<" ";
}
void Solve()
{
	cin>>k>>q;
	for(int i=1;i<=k;i++) cin>>a[i];
	sort(a+1,a+1+k); //排序是为了方便做这个 while(!ve.size()<a[1])
	while(q--) solve();//q次询问
	cout<<endl;
}
int main()
{
	int t;
	cin>>t;
	while(t--) Solve();//t组数据
	return 0;
}
posted @ 2024-05-10 19:10  日月月  阅读(10)  评论(0编辑  收藏  举报