这道题其实挺有意思,多测里面还套了个多测。
思路就是用向量模拟删除过程,具体请看代码里的注释。
#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;
}
标签:ve,CF1956A,多测,Nene,题解,int,Game
From: https://www.cnblogs.com/sapo1o/p/18185138