Codeforces 1255B Fridge Lockers

思路:

1.如果想不被其他人解开,那最优的办法就是连成环
2.多出来的次数就重复连开销最小的两个点

代码:

#define IOS ios::sync_with_stdio(false)
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
#define fi first
#define sc second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define rp(i,n) for(int i=0;i<n;i++)
#define rpn(i,n) for(int i=1;i<=n;i++)
const int MAX_N=1005;
P arr[MAX_N];
int main(){
	IOS;
	int t;
	cin>>t;
	while(t--){
		int n,m;
		cin>>n>>m;
		if(m<n||n==2){cout<<-1<<'
';rp(i,n){int a;cin>>a;}}
		else{
			int ans=0;
			rp(i,n){
				cin>>arr[i].fi;
				arr[i].sc=i+1;
				ans+=arr[i].fi;
			}
			sort(arr,arr+n);
			ans<<=1;
			int dis=m-n;
			cout<<ans+dis*(arr[0].fi+arr[1].fi)<<'
';
			for(int i=1;i<=n-1;i++) cout<<i<<' '<<i+1<<'
';
			cout<<1<<' '<<n<<'
';
			rp(i,dis) cout<<arr[0].sc<<' '<<arr[1].sc<<'
';
			rp(i,n) arr[i].fi=arr[i].sc=0;
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12308841.html