问题
https://vjudge.net/problem/UVA-10037
分析
https://blog.csdn.net/keshuai19940722/article/details/17735865
思维题目
还剩下0-i个人需要过河,首先把a[i]和a[i-1]运过河,那么有两种方法,
第一种:
a[0],a[1]
a[0]
a[i],a[i-1]
a[1]
总的时间 a[i]+2a[1]+a[0]
第二种:
a[0],a[i]
a[0]
a[0],a[i-1]
a[0]
总的时间 a[i]+a[i-1]+2a[0]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=1000+5;
int n,kase=0,a[maxn],b[maxn];
int solve(){
int ans=0,i=0;
for(i=n-1;i>=3;i-=2){
if(a[1]+a[1]-a[i-1]-a[0]<=0){
ans+=a[i]+a[1]*2+a[0];
}else ans+=a[i]+a[i-1]+2*a[0];
}
if(i==1) ans+=a[1];
else ans+=a[0]+a[1]+a[2];
return ans;
}
int main(void){
scanf("%d",&kase);
while(kase--){
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d",&a[i]);
}
sort(a,a+n);
if(n==1){
printf("%d\n%d\n",a[0],a[0]);
}else if(n==2) printf("%d\n%d %d\n",a[1],a[0],a[1]);
else if(n==3){
printf("%d\n",a[0]+a[1]+a[2]);
printf("%d %d\n%d\n%d %d\n",a[0],a[1],a[0],a[0],a[2]);
}
else{
printf("%d\n",solve());
int i=n-1;
for(;i>2;i-=2){
if(2*a[1]-a[i-1]-a[0]<=0){
printf("%d %d\n%d\n%d %d\n%d\n",a[0],a[1],a[0],a[i-1],a[i],a[1]);
}else printf("%d %d\n%d\n%d %d\n%d\n",a[0],a[i],a[0],a[0],a[i-1],a[0]);
}
if(i==1) printf("%d %d\n",a[0],a[1]);
else printf("%d %d\n%d\n%d %d\n",a[0],a[1],a[0],a[0],a[2]);
}
if(kase) printf("\n");
}
return 0;
}