版权声明:转载注明下出处就行了。 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;
}
任重而道远。