Codeforces Global Round 2 解题报告(2019.4.6号19:35)

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);
}
View Code

更改之后:

 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]

第二题:

猜你喜欢

转载自www.cnblogs.com/Aiahtwo/p/10671447.html
今日推荐