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(' '); 95 } 96 return 0; 97 }
憨代码:
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(' '); 187 } 188 return 0; 189 }