想法是:因为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");
}
}
我最没想明白的是为什么第三个点也过不了