CF379C-New Year Ratings Change

https://www.luogu.org/problemnew/show/CF379C

一道水题,折腾了我好久!

解题:

先排序,从小到大挨个满足客户,把最终rating放进集合里,判断是否已经给出,如果这个期望rating已经存在,那么取集合里最大的rating+1,既要满足期望,又不能重复,从小到大排序,每次取最大+1;

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<vector>
#include<iostream>
#include<set>
#include<cstring>
#include<queue>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;

int n;
struct node
{
    int x;///原来的数据
    int id;
};
node a[300086];

bool cmp1(node p1,node p2)
{
    return p1.x<p2.x;

}
bool cmp2(node p1,node p2)
{
    return p1.id<p2.id;
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i].x),a[i].id=i;
        sort(a,a+n,cmp1);
        set<int>se;
        se.insert(a[0].x);
        set<int>::iterator it;
        for(int i=1;i<n;i++)
        {
            it=se.end();
            it--;
            if( se.count(a[i].x) )///该x已经在set里
            {
                a[i].x=*it+1;
            }
            se.insert(a[i].x);
        }

        sort(a,a+n,cmp2);
        for(int i=0;i<n;i++)
            printf("%d ",a[i].x);
            printf("
");
    }
    return 0;
}
CF379C
原文地址:https://www.cnblogs.com/shoulinniao/p/10919230.html