75pts WA3&17~20 求助
查看原帖
75pts WA3&17~20 求助
921417
crean_楼主2023/10/5 20:07

想法是:因为t+t的倒序这个操作最多只会执行一次,所以对于a[l]只有两个数字可以加:t[l]和t[n-l+1]+t[l](数组j的功能)

于是枚举i和k 如果存在一对i和k,如果存在一对i,k使对于每一个l,都有i个t[l]+k个t[n-l+1]=b[l]那么就说明可以

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T;
	cin>>T;
	while(T--){
		int maxx=0;
		bool bo=0;
		int n;
		cin>>n;
		int b[2005],t[2005];
		int j[2005][2];//每个数有哪两个数可以加
		for(int i=0;i<n;i++){
			cin>>t[i];
		}
		for(int i=0;i<n;i++){
			cin>>b[i];
		}
		for(int i=0;i<n;i++){
			j[i][0]=t[i];
			j[i][1]=t[n-i-1]+t[i];
			maxx=max(b[i]/j[i][0]+1,maxx);//i,k的最大值
		}
		for(int i=0;i<=maxx;i++){
			int l=0;
			bool tg=0;
			for(int k=0;k<=maxx;k++){
				for(;l<n;l++){
					if(i*j[l][0]+k*j[l][1]!=b[l]) break;//这一对i,k没法让这个i*t[l]+k*t[n-l+1]成立,所以break
				}
				if(l==n){//这一对i,k能让所有l满足i*t[l]+k*t[l-n+1]=b[l]
					bo=1;
					printf("Yes\n");//有方法
					break;
				}	
			}
			if(l==n){
				break;
			}
		}
		if(bo==0) printf("No\n");
	}
	
}

我最没想明白的是为什么第三个点也过不了

2023/10/5 20:07
加载中...