P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold

Posted WeiAR

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold相关的知识,希望对你有一定的参考价值。

P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold
我比赛的时候A了,luogu上25分,QAQ,又憨又傻的200+代码,我为什么要干电脑干的事情,无语了。
如果左边<右边,取左
如果右边<左边,取右
如果相等,就向中间找,直到找到第一个不同的,然后给电脑指明下一步是取队首或队尾取就行了。

AC代码:

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<cstring>
 8 #define inf 2147483647
 9 #define For(i,a,b) for(register int i=a;i<=b;i++)
10 #define p(a) putchar(a)
11 #define g() getchar()
12 //by war
13 //2017.10.18
14 using namespace std;
15 int n;
16 int l,r;
17 int cnt;
18 char a[30010],b[30010];
19 void in(int &x)
20 {
21     int y=1;
22     char c=g();x=0;
23     while(c<0||c>9)
24     {
25     if(c==-)
26     y=-1;
27     c=g();
28     }
29     while(c<=9&&c>=0)x=x*10+c-0,c=g();
30     x*=y;
31 }
32 void o(int x)
33 {
34     if(x<0)
35     {
36         p(-);
37         x=-x;
38     }
39     if(x>9)o(x/10);
40     p(x%10+0);
41 }
42 
43 void deal(int &x,int &y)
44 {
45     int l=x,r=y;
46     while(a[l]==a[r]&&l<r)
47     l++,r--;
48         if(a[l]<a[r])
49         {
50            b[++cnt]=a[x];
51            x++;
52         }
53         else
54         {
55              b[++cnt]=a[y];
56             y--;
57         }
58 }
59 
60 int main()
61 {
62     in(n);
63     For(i,1,n)
64     cin>>a[i];
65     l=1,r=n;
66     while(l<=r)
67     {
68         if(a[l]<a[r])
69         {
70            b[++cnt]=a[l];
71            l++;
72         }
73         else
74         if(a[l]>a[r])
75         {
76              b[++cnt]=a[r];
77             r--;
78         }
79         else
80         {
81             if(l!=r)
82             deal(l,r);
83             else
84             {
85             b[++cnt]=a[r];
86             r--;    
87             }
88         }
89     }
90     For(i,1,cnt)
91     {
92         p(b[i]);
93         if(i%80==0)
94         p(\n);
95     }
96      return 0;
97 }
View Code

憨代码:

技术分享
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<queue>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<ctime>
  7 #include<cstring>
  8 #define inf 2147483647
  9 #define For(i,a,b) for(register int i=a;i<=b;i++)
 10 #define p(a) putchar(a)
 11 #define g() getchar()
 12 //by war
 13 //2017.10.18
 14 using namespace std;
 15 int n;
 16 int l,r;
 17 int cnt;
 18 char a[30010],b[30010];
 19 void in(int &x)
 20 {
 21     int y=1;
 22     char c=g();x=0;
 23     while(c<0||c>9)
 24     {
 25     if(c==-)
 26     y=-1;
 27     c=g();
 28     }
 29     while(c<=9&&c>=0)x=x*10+c-0,c=g();
 30     x*=y;
 31 }
 32 void o(int x)
 33 {
 34     if(x<0)
 35     {
 36         p(-);
 37         x=-x;
 38     }
 39     if(x>9)o(x/10);
 40     p(x%10+0);
 41 }
 42 
 43 void deal(int &x,int &y)
 44 {
 45     int l=x,r=y;
 46     char now=a[l];
 47     while(a[l]==a[r]&&l<r)
 48     {
 49         l++,r--;
 50     /*    if(a[l]==a[r]&&a[l]!=now)
 51         now=a[l];*/
 52     }
 53     if(l==r)
 54     {
 55         if(a[l]<now)
 56         {
 57         while(x<l)
 58         {
 59         b[++cnt]=a[x];
 60         x++;    
 61         }    
 62         }
 63         else
 64         {
 65         while(x<l)
 66         {
 67         b[++cnt]=a[x];
 68         x++;    
 69         }    
 70             while(y>r)
 71         {
 72         b[++cnt]=a[y];
 73         y--;    
 74         }
 75         }
 76     }
 77     else
 78     if(a[l]>=now&&a[r]>=now)
 79     {
 80         while(x<l)
 81         {
 82         b[++cnt]=a[x];
 83         x++;    
 84         }
 85         while(y>r)
 86         {
 87         b[++cnt]=a[y];
 88         y--;    
 89         }
 90     }
 91     else
 92     if(a[l]<=now&&a[r]<=now)
 93     {
 94         if(l-x>y-r)
 95         {
 96         while(y>r)
 97         {
 98         b[++cnt]=a[y];
 99         y--;    
100         }
101         }
102         else
103         if(l-x<y-r)
104         {
105             while(x<l)
106         {
107         b[++cnt]=a[x];
108         x++;    
109         }
110         }
111         else
112         if(l-x==y-r)
113         {
114             if(a[l]>a[r])
115             {
116             while(y>r)
117         {
118         b[++cnt]=a[y];
119         y--;    
120         }    
121             }
122             else
123             {
124             while(x<l)
125         {
126         b[++cnt]=a[x];
127         x++;    
128         }    
129             }
130         }
131     }
132     else
133     if(a[l]>=now&&now>=a[r])
134     {
135         while(y>r)
136         {
137         b[++cnt]=a[y];
138         y--;    
139         }
140     }
141     else
142     if(a[l]<=now&&now>=a[r])
143     {
144         while(x<l)
145         {
146         b[++cnt]=a[x];
147         x++;    
148         }
149     }
150 }
151 
152 int main()
153 {
154     in(n);
155     For(i,1,n)
156     cin>>a[i];
157     l=1,r=n;
158     while(l<=r)
159     {
160         if(a[l]<a[r])
161         {
162            b[++cnt]=a[l];
163            l++;
164         }
165         else
166         if(a[l]>a[r])
167         {
168              b[++cnt]=a[r];
169             r--;
170         }
171         else
172         {
173             if(l!=r)
174             deal(l,r);
175             else
176             {
177             b[++cnt]=a[r];
178             r--;    
179             }
180         }
181     }
182     For(i,1,cnt)
183     {
184         p(b[i]);
185         if(i%80==0)
186         p(\n);
187     }
188      return 0;
189 }
View Code

 





以上是关于P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold的主要内容,如果未能解决你的问题,请参考以下文章

P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold

P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 解题报告

[luoguP2870] [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(后缀数组)

[Luogu2870] [USACO07DEC]最佳牛线Best Cow Line(贪心+后缀数组)

P2870 [USACO07DEC]Best Cow Line G

Bzoj1692 洛谷P2870 [Usaco2007 Dec]队列变换