[題解]Mail.Ru Cup 2018 Round 1 - C. Candies Distribution

【題目】node

C. Candies Distributionios

【描述】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 }
View Code

【評測結果】io

相關文章
相關標籤/搜索