90分求调,两个没有特殊限制的WA
查看原帖
90分求调,两个没有特殊限制的WA
694647
zwxadz楼主2023/10/10 20:36
#include<bits/stdc++.h>
using namespace std;
int T,n;
int t[2005],b[2005];
int main()
{
	//freopen("data.in","r",stdin);
	//freopen("data.ans","w",stdout);
	cin>>T;
	while(T--)
	{
		cin>>n;
		for(int i=1;i<=n;i++)cin>>t[i];//输入 
		for(int i=1;i<=n;i++)cin>>b[i];
		int o=0;//o记录在执行1之前执行2的次数 
		bool flag=1;//flag记录是否成立 
		bool flag2=0;//flag2记录是否所有数都相等 
		for(int i=1;i<=n/2+n%2;i++)//加上n%2是包括n为奇数时的中间的数 
		{
			if(!flag)break;
			int j=n-i+1;//对称 
			if(t[i]==t[j])continue;//相等的话无需考虑 
			if((b[j]-b[i])%(t[j]-t[i])==0)//两个b数组中的对应的数之差除以t数组中的对应的数的差就是o的值 (如果我没推错的话) 
			{
				flag2=1;
				int p=(b[j]-b[i])/(t[j]-t[i]);
				if(p<0)flag=0;//当p为负时,说明本应该大小对应的两个数组不对应,则不成立 
				if(i==1)o=p;//直接覆盖 
				if(o!=p)flag=0;//如果不相等,说明一定不成立 
			}
			else//不能整除也不成立 
			{
				flag=0;
			}
		}
		int m=-1; 
		for(int i=1;i<=n;i++)
		{
			if(!flag)break;
			int j=n-i+1;
			b[i]-=o*t[i];//将执行o次的2,直接减去 
			int q=t[i]+t[j];//执行过一次1的 值 
			if(!flag2)q=t[i]; //如果所有值都相等,由于之前没有减掉o次,所以除以二让它包括了o次 
			int r=0;
			if(b[i]%q!=0)flag=0;//不能整除不成立 
			else r=b[i]/q;//因为在执行过一次1后,每次1都会让t的每个值乘二,类似于二进制,当能整除时就行 
			if(i==1)m=r;//m记录商的值 
			if(m!=r)flag=0;
		}
		if(flag)cout<<"Yes\n";
		else cout<<"No\n";
	}
	return 0;
}

看在我写了这么多注释的份上能帮我调一调吗

悬一关

2023/10/10 20:36
加载中...