在这道题上折磨了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行代码,有点长,其实就是看看可不可以减去操作二,再进行操作一,有点烦,但感觉是可以过去的,毕竟是自己考场上想的代码。
没有过去有点不甘心,望有人帮一下我吧。。。