[ 题解 ] [ 模拟 ] B. Hoofball

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 }

猜你喜欢

转载自www.cnblogs.com/Kaidora/p/10534675.html