求反例,玄关
查看原帖
求反例,玄关
1428495
KMYC楼主2025/7/29 16:31

思路是把正数和负数分开排序然后间隔放入原数组

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
const int eps=1e-6;
int t,n,a[N],pos[N],neg[N];
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		int cnt_pos=0,cnt_neg=0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			if(a[i]>0) pos[++cnt_pos]=a[i];
			else neg[++cnt_neg]=a[i];
		}
		if(abs(cnt_pos-cnt_neg)!=n){
			if(abs(cnt_pos-cnt_neg)>1){ cout<<"No\n"; continue; }
			sort(pos+1,pos+1+cnt_pos);
			sort(neg+1,neg+1+cnt_neg,[](int x,int y){ return abs(x)<abs(y); });
			if(cnt_pos>cnt_neg){
				for(int i=1;i<=n;i++){
					if(i%2==1) a[i]=pos[i/2+1];
					else a[i]=neg[i/2];
				}
			}else{
				for(int i=1;i<=n;i++){
					if(i%2==1) a[i]=neg[i/2+1];
					else a[i]=pos[i/2];
				}
			}
		}else sort(a+1,a+1+n);
		bool flag=true;
		for(int i=2;i<=n;i++){
			if(a[i]*a[1]!=a[2]*a[i-1]){
				flag=false;
				break;
			}
		}
		cout<<(flag?"Yes\n":"No\n");
	}
	return 0;
}
2025/7/29 16:31
加载中...