特殊性质写挂了
查看原帖
特殊性质写挂了
793625
Pink_Cut_Tree楼主2023/10/15 10:19

求助,只有 16 分

#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+5;
int T,n;
struct man{
	int rating,contri,rank;
}m[N];
bool cmp(man x,man y){
	return x.rating>y.rating;
}
int b[N];
long long ans;
bool flag;
int main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>T;
	while(T--){
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>m[i].rating;
		}
		for(int i=1;i<=n;i++){
			cin>>m[i].contri;
		}
		if(n==1){
			cout<<"0\n"; continue;
		}
		if(n==2){
			cout<<max(m[1].contri,m[2].contri)-min(m[1].contri,m[2].contri)<<"\n"; continue;
		}
		flag=0;
		for(int i=1;i<n;i++){ //特殊性质A 
			if(m[i].contri!=m[i+1].contri){
				flag=1; break;
			}
		}
		if(flag==0){ //特殊性质A 
			cout<<(n-2)*m[1].contri<<"\n"; continue;
		}
		flag=0;
		for(int i=1;i<=n;i++){ //特殊性质C 
			if(m[i].contri<0){
				flag=1; break;	
			}
		}
		sort(m+1,m+n+1,cmp);
		if(flag==0){ //特殊性质C 
			long long sum=0;
			for(int i=2;i<=n;i++){
				sum+=m[i].contri;
			} 
			if(sum>=m[1].contri){
				cout<<sum-m[1].contri<<"\n"; continue;
			}
		}
		for(int i=1;i<=n;i++){
			m[i].rank=i;
		}
		for(int i=1;i<=n;i++){
			b[i]=i;
		}
		ans=-1e9;
		do{
			long long cnt=0;
			for(int i=1;i<=n;i++){
				if(m[i].rank>b[i]){
					cnt+=m[i].contri;
				}
				else if(m[i].rank<b[i]){
					cnt-=m[i].contri;
				}
			}
			ans=max(ans,cnt);
		}while(next_permutation(b+1,b+n+1));
		cout<<ans<<"\n";
	}
return 0;
}
2023/10/15 10:19
加载中...