23年暑期课程2.基础巩固练习 G.种植花朵 TLE0 #求助

老师讲过解法了,但还是不理解自己的为什么会超时

块引用
#include<bits/stdc++.h>
using namespace std;
int t,n,m,a[105];
int main()
{
cin>>t;
while(t–)
{
cin>>n>>m;
for(int i=1;i<=n;i++) scanf(“%d”,&a[i]);
if(n==1 && a[n]==0) m–;
else if(n==1 && a[n]==1) m–;
else
{
for(int i=1;i<=n;i++)
{
if(i=1 && a[i]+a[i+1]==0) {a[i]=1;a[i+1]=1;m–;}
else if(i=n && a[i-1]+a[i]==0) {a[i-1]=1;a[i]=1;m–;}
else if(a[i-1]+a[i]+a[i+1]==0) {a[i-1]=1;a[i]=1;a[i+1]=1;m–;}
}
}
if(m==0) printf(“true\n”);
else printf(“false\n”);
}
return 0;
}

把格式调一调吧
选中代码之后,按image,就能变成代码格式了。

#include<bits/stdc++.h>
using namespace std;
int t,n,m,a[105];
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		if(n==1 && a[n]==0) m--;
		else if(n==1 && a[n]==1) m--;
		else
		{
			for(int i=1;i<=n;i++)
			{
				if(i=1 && a[i]+a[i+1]==0) {a[i]=1;a[i+1]=1;m–;}
				else if(i=n && a[i-1]+a[i]==0) {a[i-1]=1;a[i]=1;m–;}
				else if(a[i-1]+a[i]+a[i+1]==0) {a[i-1]=1;a[i]=1;a[i+1]=1;m–;}
			}
		}
		if(m==0) printf("true\n");
		else printf("false\n");
	}
	return 0;
}

if(i=1 && a[i]+a[i+1]==0) {a[i]=1;a[i+1]=1;m–;}
else if(i=n && a[i-1]+a[i]==0) {a[i-1]=1;a[i]=1;m–;}
else if(a[i-1]+a[i]+a[i+1]==0) {a[i-1]=1;a[i]=1;a[i+1]=1;m–;}

你后面加个continue试试?

1 个赞

试过了,还是超时·-·

else if(n==1 && a[n]==1) m--;

去掉试试?

1 个赞
#include<bits/stdc++.h>
using namespace std;
int t,n,m,a[105];
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		if(n==1 && a[n]==0) m--;
		else
		{
			for(int i=1;i<=n;i++)
			{
				if(i==1 && a[i]+a[i+1]==0) {a[i]=1;a[i+1]=1;m–;}
				else if(i==n && a[i-1]+a[i]==0) {a[i-1]=1;a[i]=1;m–;}
				else if(a[i-1]+a[i]+a[i+1]==0) {a[i-1]=1;a[i]=1;a[i+1]=1;m–;}
			}
		}
		if(m==0) printf("true\n");
		else printf("false\n");
	}
	return 0;
}

[/quote]

1 个赞
#include<bits/stdc++.h>
using namespace std;
int t,n,m,a[105];
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		if(n==1 && a[n]==0) m--;
		else
		{
			for(int i=1;i<=n;i++)
			{
				if(a[i-1]+a[i]+a[i+1]==0)
				{
					m--;
					a[i]=1;
				}
			}
		}
		if(m==0) printf("true\n");
		else printf("false\n");
	}
	return 0;
} 
1 个赞

变成WA0了
(⊙o⊙)…

#include <bits/stdc++.h>
using namespace std;
int n,m,q,a[105];
int main()
{
	cin>>q;
	while(q--)
	{
		memset(a,0,sizeof(a));
		cin>>n>>m;
		for(int i=1;i<=n;i++)scanf("%d",&a[i]);
		for(int i=1;i<=n;i++)
		{
			if(!(a[i]+a[i-1]+a[i+1]))
			{
				a[i]=1;
				m--;
			}
		}
		if(m>0)cout<<"false"<<endl;
		else cout<<"true"<<endl;
	}
	return 0;
}
1 个赞

解决了,谢谢

#include<bits/stdc++.h>
using namespace std;
int t,n,m,a[105];
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		memset(a,0,sizeof a);
		for(int i=1; i<=n; i++) scanf("%d",&a[i]);
		for(int i=1; i<=n; i++)
			if(a[i-1]+a[i]+a[i+1]==0)
			{
				a[i]=1;
				m--;
			}
		if(m<=0) printf("true\n");
		else printf("false\n");
	}
	return 0;
}

问题:
1.没初始化a数组
2.第一次写的代码有vis数组,后面忘记去掉↓

a[i-1]=1;
a[i+1]=1;

对原数组不能进行此操作,与 a[i-1]+a[i]+a[i+1]==0 配合使用会产生错误
3.if(m==0) printf("true\n");中m<0的情况也成立,逻辑运算符错误