【題目】node
【描述】ide
n個小朋友排排坐吃糖糖,小朋友從左到右編號1到n。每一個小朋友手上有必定數量的糖。對於第i個小朋友來講,編號比他小的小朋友中有li個小朋友擁有的糖比他多,編號比他大的小朋友中有ri個小朋友擁有的糖比他多。已知每一個小朋友手上至少有1顆糖、最多有n顆糖,求一種可能的每一個小朋友手上的糖的數量的情形,輸出YES和一種情形;若是不存在這樣的可能,則輸出NO。spa
數據範圍:1<=n<=1000,0<=li,ri<=ncode
【思路】blog
對於第i個小朋友來講,有li+ri個小朋友比他的糖多,那麼給他n-(li+ri)顆糖,即便那li+ri個比他糖多的小朋友擁有的糖的個數都不相同(即糖數分別爲n-(li+ri)+1,...,n),也不會出現矛盾。按照這樣的思路給你們發了糖以後,驗證每一個小朋友左右的比他糖多的小朋友的人數是否符合li和ri。若是符合,就輸出該方案;不然,不存在可能的方案。get
這道題我在比賽中沒想出來【還想了很久很久……】,其實當時已經想到了,這實際上就是以「有多少人比本身糖多」給小朋友分組,但當時沒想清楚怎麼考慮左右關係。事實上,不管最終的分糖方案是什麼,「獲得相同數量的糖」的小朋友的分組都是同樣的,對於每一個小朋友進行檢查li和ri就能夠了。複雜度O(n^2)。string
【個人實現】it
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 7 using namespace std; 8 #define MaxN 1020 9 //int L[MaxN], R[MaxN]; 10 int ans[MaxN]; 11 12 struct node 13 { 14 int L, R; 15 int Have; 16 }a[MaxN]; 17 18 int main() 19 { 20 int n; 21 int i, j; 22 int iL, iR; 23 scanf("%d", &n); 24 for(i = 1; i <= n; i++) 25 scanf("%d", &a[i].L); 26 for(i = 1; i <= n; i++) 27 scanf("%d", &a[i].R); 28 for(i = 1; i <= n; i++) 29 a[i].Have = n - a[i].L - a[i].R; 30 for(i = 1; i <= n; i++) 31 { 32 iL = 0; 33 for(j = 1; j < i; j++) 34 if(a[j].Have > a[i].Have) 35 iL++; 36 iR = 0; 37 for(j = i + 1; j <= n; j++) 38 if(a[j].Have > a[i].Have) 39 iR++; 40 if(iL != a[i].L || iR != a[i].R) 41 { 42 printf("NO\n"); 43 return 0; 44 } 45 } 46 printf("YES\n"); 47 for(i = 1; i <= n; i++) 48 printf("%d ", a[i].Have); 49 return 0; 50 }
【評測結果】io