Bridge UVA - 10037贪心

问题

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]+2
a[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;
}
发布了180 篇原创文章 · 获赞 3 · 访问量 3459

猜你喜欢

转载自blog.csdn.net/zpf1998/article/details/105018289
今日推荐