题目

本题的意思就是让你先杀死咒语强度小的怪物,它的生命值就是你所需要的时间,然后把杀死怪物的咒语强度加给它相邻的两个怪物,第一个只加给后面,最后一个只加给前面,依次往后直到杀死全部怪物。

本题可以直接贪心,因为到最后每一个怪物的生命值和咒语强度都加了一次,最后一个除外(因为最后一个杀完就结束了),因为是从咒语强度最小的开始,最后一个肯定是咒语强度最大的,所以我们可以直接把所有的值加在一起再减去咒语强度最大的,直接贪心就可以了。

方法一:使用数组存储数据,排序后求最大值
#define ll long long
using namespace std;
const int N=1e5+10;
ll n;
ll a[N*2];
void solve(ll x) {
    ll sum = 0;
    ll y;
    for (int i = 0; i < x; i++) {
        cin >> y;
        sum += y;
    }
    for (int i = 0; i < x; i++) {
        cin >> y;
        a[i] = y;
        sum += y;
    }
    sort(a, a + x);
    cout << sum - a[x - 1] << '\n';
}
int main() {
    ios::sync_with_stdio(0);//使cin cout进行加速,让输入输出速度和scanf和printf差不多
    cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while (t--) {
        cin >> n;
        solve(n);
    }
    return 0;
}
方法二:不使用数组,降低空间复杂度,再输入的时候就找最大值输入结束,最大值也就找完
#define ll long long
using namespace std;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    ll t;cin>>t;
    while(t--){
        ll ma=0;
        ll n,sum=0,m;cin>>n;
        for(int i=0;i<n;i++){cin>>m;sum+=m;}
        for(int i=0;i<n;i++){
            cin>>m;
            sum+=m;
            if(m>ma)ma=m;
        }
        cout<<sum-ma<<'\n';
    }
    return 0;
}
方法三:时间和空间目前我认为最短的写法
#define ll long long
using namespace std;
void solve(){
    ll ma=0;
    ll n,sum=0,m;cin>>n;
    for(int i=0;i<n;i++){cin>>m;sum+=m;}
    for(int i=0;i<n;i++){
        cin>>m;
        sum+=m;
        if(m>ma)ma=m;
    }
    cout<<sum-ma<<'\n';
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    ll t;cin>>t;
    while(t--)solve();
    return 0;
}