http://codeforces.com/group/NVaJtLaLjS/contest/238204/problem/B
题意:
N只牛在不同的位置上,农夫把球递给一只牛,这牛就会把球传给离它最近的牛。
(规定如果与左右的牛距离相等,传给左边的牛)
现在问要准备多少球,才能保证所有的牛都至少传过一次球。
示例:
Input:
5 7 1 3 11 4
Output:
2
首先排序是肯定要的。
你会发现,球会在两只距离最近的牛之间来回传递。这个坑爹设定导致写出来的并查集之类的代码过不了。
(你见过有两个根的树乜?虽然更可能是我的并查集本来就不完善。)
后来我在纸上模拟的时候想到了个操作,绝对简单明了:
1,3,4,7,11,
>,>,<,<,<,
>,=,=,<,<,
2
这里有多少个</>串?两个,这就是答案!
一只牛向左传球,就记为 < ,向右就记为 > ;
在</>的起点放球,就能传递到</>的终点。你只要数一下</>串有多少个,或者说</>方向改变了多少次就可以了。
当时画蛇添足,把><换成==,导致代码非常复杂:
(自己做的话直接数<>改变次数就好)
1 #include <stdio.h> 2 3 int cows[102]={0}; 4 char link[102]={0}; 5 int ball[102]={0}; 6 7 int findnear(int i) 8 { 9 int left=cows[i]-cows[i-1]; 10 int right=cows[i+1]-cows[i]; 11 if(right<left)link[i]='>'; 12 else link[i]='<'; 13 return 0; 14 } 15 16 int main() 17 { 18 int N,tmp; 19 int answer=0; 20 scanf("%d",&N); 21 cows[0]=-9999; 22 cows[N+1]=9999; 23 24 for(int n=1;n<=N;n++) 25 { 26 scanf("%d",&cows[n]); 27 for(int i=n;i>1;i--) 28 { 29 if(cows[i]<cows[i-1]) 30 { 31 tmp=cows[i]; 32 cows[i]=cows[i-1]; 33 cows[i-1]=tmp; 34 } 35 } 36 } 37 38 for(int n=1;n<=N;n++) 39 { 40 // printf("No.%d\n",n); 41 findnear(n); 42 } 43 /* 44 for(int n=1;n<=N;n++) 45 printf("%d,",n); 46 puts(""); 47 */ 48 for(int n=1;n<=N;n++) 49 printf("%d,",cows[n]); 50 puts(""); 51 52 for(int n=1;n<=N;n++) 53 printf("%c,",link[n]); 54 puts(""); 55 56 for(int n=1;n<N;n++) 57 { 58 if(link[n]=='>') 59 if(link[n+1]=='<') 60 link[n]=link[n+1]='='; 61 } 62 63 for(int n=1;n<=N;n++) 64 printf("%c,",link[n]); 65 puts(""); 66 67 for(int n=1;n<=N;n++) 68 { 69 if(link[n]=='=') 70 { 71 72 if(link[n-1]=='>' && link[n+2]=='<') 73 { 74 answer++; 75 ball[n]=answer; 76 for(int i=n-1;link[i]=='>';i--) 77 { 78 ball[i]=answer; 79 } 80 n++;answer++; 81 ball[n]=answer; 82 for(int i=n+1;link[i]=='<';i++) 83 { 84 ball[i]=answer; 85 } 86 // puts(">==<"); 87 } 88 else 89 if(link[n-1]!='>' && link[n+2]=='<') 90 { 91 answer++; 92 ball[n]=answer; n++; 93 ball[n]=answer; 94 for(int i=n+1;link[i]=='<';i++) 95 { 96 ball[i]=answer; 97 } 98 // puts("==<"); 99 } 100 else 101 if(link[n-1]=='>' && link[n+2]!='<') 102 { 103 answer++; 104 ball[n]=answer; 105 for(int i=n-1;link[i]=='>';i--) 106 { 107 ball[i]=answer; 108 } 109 n++; 110 ball[n]=answer; 111 // puts(">=="); 112 } 113 else 114 if(link[n-1]!='>' && link[n+2]!='<') 115 { 116 answer++; 117 ball[n]=answer; n++; 118 ball[n]=answer; 119 // puts("=="); 120 } 121 122 } 123 } 124 /* 125 for(int n=1;n<=N;n++) 126 { 127 printf("%d,",ball[n]); 128 } 129 puts(""); 130 */ 131 printf("%d\n",answer); 132 return 0; 133 }