题意:将抽到该编号的同学放置队尾,注意可能重复抽取。最后取排在队伍前五的同学,并输出其编号。
题解:使用pair数组保存每位同学的属性,第一个变量模拟该同学的队伍位置(初始为0)。第二个变量为该同学的初始编号。若抽到该同学则将该同学的first++,最后对pair数组进行排序。充分利用了pair排序的性质,当第一个变量不相等时,优先排第一个变量,否则排第二个变量。最后排完序取前五的同学。还要将编号从小到大排序输出。
#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define endl '\n'
#define N 100005
using namespace std;
const ll inf=0x3f3f3f3f;
const double PI=acos(-1);
const ll mod=1e9+7;
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) { return a * b / gcd(a, b); }
pair<int,int>p[N];
vector<int>v;
int main()
{ios
int n,m,k;
cin >>n>>m;
for(int i=1;i<=n;i++)
{
p[i].second=i;
p[i].first=0;
}
int res=1;
while(m--)
{
cin >>k;
p[k].first=res++;
}
sort(p+1,p+1+n);
for(int i=1;i<=5;i++)
{
v.push_back(p[i].second);
}
sort(v.begin(),v.end());
for(auto it: v)
{
cout <<it<<" ";
}
return 0;
}