这道是签到题
- 但是我花了很久时间没写出来
悲伤,这里记录一下思维的过程吧
牛客练习赛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; }