B. Farewell Party (细节使我掉分)

版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/85050413

题目链接:https://codeforces.com/contest/1081/problem/B

题意:有n顶不同的帽子,现在给你n个数,ai表示第i个人说,有ai个人与自己的帽子不同,问你是否能求出一种解决方案,能的话,输出一组。

题解:这题ai表示第i个人说,有ai个人与自己的帽子不同,那么我们可以反过来看,就是说有n-ai个人与自己的帽子相同,我们先按帽子排序一下,最后输出时再按序号排序一下。我就是忘了排序,一直wa,今天坐着想重看一下,看了wa掉的数据,ai,我就是差了个排序,细节啊,只能接受掉分的现实了,早知赛前就不奶了。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

struct node
{
    int state;///说明有state个人的帽子与我相同
    int type;///存储每个人帽子的类型
    int id;///存储每个人的id
} num[100010];
bool cmp(node a,node b) ///
{
    return a.state>b.state;
}
bool cmp1(node a,node b)
{
    return a.id<b.id;
}

int book[100010];///book[i]表示记录i类型的帽子有多少个

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(book,0,sizeof(book));
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&num[i].state);
            num[i].state=n-num[i].state; ///反过来
            num[i].id=i;
        }
        sort(num+1,num+1+n,cmp); ///按帽子类型排
        num[0].state=-1;

        int item=1;
        bool flag=true;
        num[1].type=1; ///初始化
        int sum=num[1].state-1;
        for(int i=2; i<=n; i++) ///给每个人赋值帽子类型
        {

            if(sum>0)
            {
                num[i].type=item;
                sum--;
            }
            else
            {
                num[i].type=++item;
                sum=num[i].state-1;///换下一中类型
            }
            if(item>n)
            {
                printf("Impossible\n");
                flag=false;
                break;
            }
        }




        if(flag)
        {

            bool flag2=true;

            for(int i=1; i<=n; i++) ///判断此分配方案是否合法
            {
                int j=num[i].type;
                book[j]+=1; ///记录每种类型的数量
            }




            for(int i=1; i<=n; i++)
            {
                if(num[i].state!=book[num[i].type])   ///如果不等,说明这方案不行了
                {
                    flag2=false;
                    break;
                }
            }

            if(flag2)
            {
                sort(num+1,num+1+n,cmp1); ///按id排序一下
                printf("Possible\n");
                for(int i=1; i<=n; i++)
                    printf("%d ",num[i].type);
                puts("");
            }
            else
            {
                printf("Impossible\n");
            }
        }


    }
    return 0;
}

任重而道远。

猜你喜欢

转载自blog.csdn.net/LJD201724114126/article/details/85050413
今日推荐