@zsh-o
2018-12-22T10:33:01.000000Z
字数 1216
阅读 1082
算法

单纯用排序会超时,采用桶的思想,需要注意的是多种情况要满足字典序最小
#include <stdio.h>#include <string.h>struct ListNode{int value;int index;ListNode* next;ListNode(){value = 0; index = 0;next = NULL;}};struct List{int n;ListNode* next;List(){n = 0; next = NULL;}};const int MAXN = 1000000;const int MAXA = 10;int n, na, nb;List L[MAXA];int S[MAXN];void Insert(List* L, int a, int i){ListNode* t = new ListNode();t->index = i;t->value = a;t->next = L[a].next;L[a].next = t;L[a].n++;}int main(){int a;scanf("%d%d%d", &n, &na, &nb);for(int i=0; i<n; i++){scanf("%d", &a);Insert(L, a, i);}int n1 = na < nb ? na : nb;int n2 = na + nb - n1;int i = MAXA;ListNode* p = L[i].next;while(n1 > 0){while(p && n1>0){if(na < nb){S[p->index] = 1;}else{S[p->index] = 2;}p = p->next;n1--;}if(n1!=0){i--;p = L[i].next;if(n1 < L[i].n){break;}}}int rn1, rn2;if(na < nb){rn1 = n1;rn2 = L[i].n - n1;while(rn2 > 0){S[p->index] = 2;rn2--;n2--;p = p->next;}while(rn1 > 0){S[p->index] = 1;rn1--;n1--;p = p->next;}}else{rn1 = L[i].n - n1;rn2 = n1;while(rn2 > 0){S[p->index] = 2;rn2--;n2--;p = p->next;}while(rn1>0){S[p->index] = 1;rn1--;n1--;p = p->next;}}while(n2>0){while(p && n2>0){if(na < nb){S[p->index] = 2;}else{S[p->index] = 1;}p = p->next;n2--;}if(n2!=0){i--;p = L[i].next;if(n2 < L[i].n){break;}}}printf("\n");for(int i=0; i<n; i++){printf("%d ", S[i]);}printf("\n");}
53 24 4 5 4 41 1 2 1 2---------------------------52 34 4 5 4 41 2 1 2 2