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


京公网安备 11010502036488号