这道是签到题

  • 但是我花了很久时间没写出来
    悲伤,这里记录一下思维的过程吧
    牛客练习赛74

WA

#include
#include
using namespace std;
int a[100000];
int main()
{
    int n;
    int i;
    int cnt=0,b=0,c=0,d=0;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
    if(n<3)
    {
        printf("NO");
        return 0;
    }
    for(i=0; i<n-2; i++)
    {
        if(a[i]+a[i+2]==2*a[i+1])
            cnt++;
        else
            break;
    }
     for(i=0; i<n-2; i++)
    {
        if(a[i]*a[i+2]==a[i+1]*a[i+1])
           b=1;
        else
            break;
    }
     for(i=0; i<n-2; i+b+)
    {
        if(a[i+1]%a[i]==a[i+2]%a[i+1])
            c=1;
        else
            break;
    }
    if(dengcha==1)
        printf("YES");
    else
        printf("NO");
    return 0;
}

这里是想着用累加滚动的形式把题目做出来,后来发现自己卡了很久就烂尾了


这里贴一下dl的代码 AC

#include
long long a[100005];
int main(){
    int n,i,cont=0,b=0,c=0;
    scanf("%d",&n);
    for(i=0;i<n;i++){
      scanf("%lld",&a[i]);
    }
    if(n<3){
        printf("NO");
        return 0;
    }
    int p=0;//p相当于是一个旗帜;
    for(i=0;i<n-2;i++){
      if(2*a[i+1]==a[i]+a[i+2]){
         cont++;
         if(cont==n-2){
           p=1;
           printf("YES");
           return 0;} //一定要return 0,不然输出好多个yes
         }
      }
      for(i=0;i<n-2;i++){
      //cont=0;
      if(a[i+1]*a[i+1]==a[i+2]*a[i]){
         b++;
         if(b==n-2){
            p=1;
            printf("YES");
            return 0;}
           }
      }
      for(i=0;i<n-2;i++){
      cont=0;
      if(a[i+1]%a[i]==a[i+2]%a[i+1]){
         c++;
         if(c==n-2){
            p=1;
            printf("YES");
            return 0;
           }
      }
    }
    if(p==0){
        printf("NO");
    }
    return 0;
}
  • 然后就转变思想,找不同 WA
#include
#include
using namespace std;
long long a[100005];
int main()
{
    int n;
    int i;
    int b=0,c=0,d=0;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%lld",&a[i]);
    }
    for(i=0; i<n-2; i++)
    {
        if(a[i]+a[i+2]!=2*a[i+1])
            break;
        else
            d=1;
    }
     for(i=0; i<n-2; i++)
    {
        if(a[i]*a[i+2]!=a[i+1]*a[i+1])
            break;
        else
            b=1;
    }
     for(i=0; i<n-2; i++)
    {
        if(a[i+1]%a[i]!=a[i+2]%a[i+1])
            break;
        else
            c=1;
    }
    if(d==1||b==1||c==1)
        printf("YES\n");
    else
        printf("NO\n");
    return 0;
}

这个时候我还没意识到自己每个循环里非常大的问题
那就是 如果我输入的数列里前面几个是满足数列要求,但是后面不满足的话,我的旗帜也变了且后面无法改变,导致答案错误,
虽然测试显示我通过了90%的样例,但是千万就不要觉得这个是小问题啊!!!
后来在dz'的帮助下我成功发现了自己的思维的漏洞
AC

#include
#include
using namespace std;
long long a[100005];
int main()
{
    int n;
    int i;
    int b=1,c=1,d=1;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%lld",&a[i]);
    }
    for(i=0; i<n-2; i++)
    {
        if(a[i]+a[i+2]!=2*a[i+1])
            {d=0;break;} //加个break 时间min ;但是这道题然并卵
    }
     for(i=0; i<n-2; i++)
    {
        if(a[i]*a[i+2]!=a[i+1]*a[i+1])
            {b=0;break;}
    }
     for(i=0; i<n-2; i++)
    {
        if(a[i+1]%a[i]!=a[i+2]%a[i+1])
            {c=0;break;}
    }
    if(d||b||c)
        printf("YES\n");
    else
        printf("NO\n");
    return 0;
}

这个思维就是如果我找到了不同,就直接改标记,不用考虑相同的情况,旗帜没变嘛!!

这个思想转变非常非常重要 要引起重视!!!

再if / else形式判断旗子输出来

最后把dzdl的快读代码摆出来,供以后碰到时间限制太死的情况用;
时间排序 快读《scanf《cin;

#include
int n,f1=1,f2=1,f3=1;
int a[100005];
template inline void read(T&x){
    T f=1;x=0;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    x*=f;
}
int main(){
    read(n);
    for(int i=1;i<=n;i++)read(a[i]);
    int A=a[2]-a[1],C=a[2]%a[1]; //建立两个基准数,树为标准
    for(int i=3;i<=n;i++){
        if(a[i]-a[i-1]!=A)f1=0;
        if(a[i]*a[1]!=a[i-1]*a[2])f2=0; /*等比要变一下,不能直接简单相除,细节处理*/
        if(a[i]%a[i-1]!=C)f3=0;
    }
    if(f1||f2||f3)printf("YES\n");
    else printf("NO\n");
    return 0;
}