http://codeforces.com/contest/1119
第一题:
心得:超时,然后想用快速输入函数 -- inline int read()看下可不可以解决,发现他确实能减少时间,但是还是不行,然后换了一种方法
之前的代码:
#include<iostream> using namespace std; int a[300005]; #define gc getchar() inline int read(){ int x=0,f=0;char c=gc; for(;c<48||c>57;c=gc) if(c=='-')f=1; for(;c>47&&c<58;c=gc) x=x*10+c-48; return f?-x:x; } #define io read() int main() { int n; n=io; for(int i=0;i<n;i++) a[i]=io; int maxn=0; int j; for(int i=0;i<n;i++) { for(j=n-1;j>i;j--) { if(a[j]!=a[i]&&maxn<(j-i)) { maxn=j-i; break; } } if((maxn==n-1)||maxn>(n-i)) break; } printf("%d\n",maxn); }
更改之后:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int a[300005]; 5 #define gc getchar() 6 inline int read(){ 7 int x=0,f=0;char c=gc; 8 for(;c<48||c>57;c=gc) 9 if(c=='-')f=1; 10 for(;c>47&&c<58;c=gc) 11 x=x*10+c-48; 12 return f?-x:x; 13 } 14 #define io read() 15 int main() 16 { 17 int n; 18 n=io; 19 for(int i=0;i<n;i++) 20 a[i]=io; 21 int ans=0; 22 for (int i = 0; i < n; i++) { 23 if (a[0] != a[i]) { 24 ans = max(ans, i); 25 } 26 if (a[n - 1] != a[i]) { 27 ans = max(ans, n - 1 - i); 28 } 29 } 30 printf("%d\n",ans); 31 }
主要代码解释:
1 for (int i = 0; i < n; i++) { 2 if (a[0] != a[i]) { 3 ans = max(ans, i); 4 } 5 if (a[n - 1] != a[i]) { 6 ans = max(ans, n - 1 - i); 7 } 8 }
其实只需要一个循环:
仔细思考了一下,i和j必定有一个在头(a[0])或者是尾(a[n-1])
答案构成只有两种情况:
a[0]---a[t]
a[t]---a[n-1]
证明一下:
假设i,和j都在中间
设a[i]=3,a[j]=4;
i与j中间的先简化不考虑
head,3,4,tail
由于答案是a[i]与a[j],所以head一定是4(不能是其他值,如果与4不同,那就是取head,就是head到4)
所以tail一定是3(不能是其他值,如果与3不同,那就是取tail,就是3到tail)
最后这样的话取值结果就是4,3,4,3
明显可以看出矛盾,结果应该是tail-head(不是j-i)
所以答案构成只有两种情况:
a[0]---a[t]或者a[t]---a[n-1]
第二题: