Codeforces Round #101 (Div. 2)C. Queue

本文介绍了一种解决特定队列还原问题的方法。该问题要求根据每个人前面比他高的指定人数来重建一个队列,并确定每个人的身高。解决方案首先按指定人数排序,再依次分配身高并插入队列中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接
题意:给定n个人以及每个人前面比他高的人数a[i]。让你还原这个队列及每个人的高度。

题解:

按照a排序,然后给这n个人分配身高,显然a大的人的身高尽可能低,所以身高高度从n到1进行分配。
然后让每个人进行入队,对于第i个人,考虑其入队情况。根据身高分配规则可知,队列中的每个人都比其要高。然后将i插入到a[i]的位置即可,此时满足i前面比i高的人个数为a[i],并且i入队不改变队列中的原本的a。

#include<bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
#define psi pair<string,int>
using namespace std;
const int N = 4000;
struct node{
    string name;
    int a;
    bool operator <(node b)const{
        return a<b.a;
    }
}p[N];
int s[N];
void out(int x){
    cout<<x;
    exit(0);
}
int main()
{
    freopen("a.txt","r",stdin);
    ios::sync_with_stdio(0);
    int n,i,j;
    cin>>n;
    for(i = 1;i <= n;i ++) s[i] = i;
    for(i = 1;i <= n;i ++)
        cin>>p[i].name>>p[i].a;
    sort(p+1,p+n+1);
    vector<psi>ans;
    for(i = 1;i <= n;i ++){
       if(p[i].a>=i)out(-1);
       ans.insert(ans.begin()+p[i].a,make_pair(p[i].name,n-i+1));
    }
    for(auto v:ans)
        cout<<v.first<<' '<<v.second<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值