90pts,18WA20WA求助
查看原帖
90pts,18WA20WA求助
1010349
huanyizhiyuan楼主2023/10/6 16:35

在这道题上折磨了10个小时,我的方法始终是90pts,最后换了别人的方法过了。

但是有点不甘心,我加入了别人的一个判断回文串就过了,难道是我的代码中的x_judge判断不对么?

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#define ll long long
#define maxn 10005
#define inf 1e9+5
using namespace std;
int T,n;
int t[maxn],b[maxn],x_judge,xx_judge,flag,flag2;
int main(){
	scanf("%d",&T);
	while(T--){
		flag=flag2=x_judge=xx_judge=0;
		scanf("%d",&n);
		for(int i=0;i<n;i++)
			scanf("%d",&t[i]);
		for(int i=0;i<n;i++)
			scanf("%d",&b[i]);

		for(int i=0;i<=n/2;i++){
		
			if(b[i]<t[i]||b[n-i-1]<t[n-i-1]){
				{flag=1;break;}}
				
			else if(t[i]==t[n-i-1]){ 
				if(b[i]!=b[n-i-1])
					{flag=1;break;}}
					
			else if(t[i]>t[n-i-1]){
				if(b[i]<b[n-i-1])
					{flag=1;break;}
				else
					{x_judge=(b[n-i-1]-b[i])/(t[n-i-1]-t[i]);flag2=1;break;}} 
					
			else if(t[i]<t[n-i-1]){
				if(b[i]>b[n-i-1])
					{flag=1;break;}
				else
					{x_judge=(b[i]-b[n-i-1])/(t[i]-t[n-i-1]);flag2=1;break;}} 
			
		}
		//cout<<"x_judge="<<x_judge<<endl;
		//cout<<"flag2="<<flag2<<endl;
		//此时x_judge==0只有两种情况,要么t数组全部都是一一对应,要么就是b数组对应相等,要么就是只需要操作二。 
		//我们必须把潜藏的操作二给找到!
		if(x_judge==0&&flag2!=1){//flag2!=1排除了只需要操作二但是t不对应相等的。
			//剩下的就算只需要操作二,那也可以由两次操作一替代! 
			//此时也必须要防一下奇数个数,导致t={2 2 2 2 2},b={6 6 5 6 6}这种情况
			//此时主要是t={2,2,2,2,2},b={2,2,2,2,2}也就是一次操作二!
			//此时只剩下t对应相等的情况
			//其实此时的操作二和操作一没有任何区别!
			//直接除就行了,必须是对应相等的。
			x_judge=b[0]/t[0];
			for(int i=0;i<n;i++){
				if(b[i]-t[i]*x_judge!=0)
					{flag=1;break;}
			}
			if(flag){printf("No\n");continue;}
			else {printf("Yes\n");continue;}
		} 
		//cout<<"到这里了"<<endl;
		//减完操作二,那就只剩操作一了吧!!! 
		xx_judge=(b[0]-t[0]*x_judge)/(t[0]+t[n-1]);
		for(int i=0;i<n;i++){
			if(b[i]-t[i]*x_judge-(t[i]+t[n-1-i])*xx_judge!=0)
				{flag=1;break;}
		}
		if(flag){printf("No\n");continue;}
		else {printf("Yes\n");continue;}
	
	}
	return 0;
} 

75行代码,有点长,其实就是看看可不可以减去操作二,再进行操作一,有点烦,但感觉是可以过去的,毕竟是自己考场上想的代码。

没有过去有点不甘心,望有人帮一下我吧。。。

2023/10/6 16:35
加载中...