题解:P11309 纷飞的樱花雨

一道小分讨。

坑点在于交换可以不相邻且不能自己交换

观察到只要 \(k \ge 1\) 就一定能将最大值换到最前面,剩下的随便换就行。但 \(n=2\) 是例外,此时没有剩余可交换的,手动特判 \(k\) 的奇偶性即可。

\(k=0\),则直接计算答案。

整合即可得出代码:

#include<bits/stdc++.h>
using namespace std;
long long t, n, k, a[100005];
int main(){
	cin >> t;
    while(t --){
        cin >> n >> k;
        for(long long i = 1; i <= n; i ++) cin >> a[i];
        if(n == 2){//特判 n = 2
            if(k & 1){//奇数相当于换一次
                swap(a[2], a[1]);
                if(a[1] > a[2]) cout << a[1] * 2 << "\n";
                else cout << a[1] + a[2] << "\n";
                continue;
            }
            else{//反之相当于没换
                if(a[1] > a[2]) cout << a[1] * 2 << "\n";
                else cout << a[1] + a[2] << "\n";
                continue;
            }
        }
        if(k != 0){//最大值换到最前面
            long long maxn = 0;
            for(long long i = 1; i <= n; i ++) maxn = max(maxn, a[i]);
            cout << maxn * n << "\n";
        }
        else{//无法操作,直接计算
            long long sum = 0, maxn = 0;
            for(long long i = 1; i <= n; i ++) maxn = max(maxn, a[i]), sum += maxn;
            cout << sum << "\n";
        }
    }
	return 0;
}

posted on 2025-01-11 14:18  zhangzirui66  阅读(20)  评论(0)    收藏  举报

导航