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<<'\n';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)<<'\n';
for(int i=1;i<=n-1;i++) cout<<i<<' '<<i+1<<'\n';
cout<<1<<' '<<n<<'\n';
rp(i,dis) cout<<arr[0].sc<<' '<<arr[1].sc<<'\n';
rp(i,n) arr[i].fi=arr[i].sc=0;
}
}
return 0;
}