B. Farewell Party (細節使我掉分)
阿新 • • 發佈:2018-12-20
題目連結: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; }
任重而道遠。