# Greedy# Sorting

e178 - Runningman - 翻牌挑戰

🔗 前往 ZeroJudge 原題

題目描述

題目給定一組數字,每個數字的正負號可以翻轉。目標是在給定的翻轉次數 k 內,最大化所有數字的總和。

解題思路

首先,將所有數字排序。然後,貪心地翻轉所有負數,直到翻轉次數用完。如果翻轉次數還剩餘,且剩餘次數為奇數,則翻轉最小的正數。最後,計算所有數字的總和。

複雜度分析

  • 時間複雜度: O(n log n) (主要來自排序)
  • 空間複雜度: O(n) (用於儲存數字陣列)

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int n,k;
	while(cin >> n >> k){
		if(n==0)cout << "0\n";
		else{
			long long int a[n]={0},ans=0;
			for(int i=0;i<n;++i)
				cin >> a[i];
			sort(a,a+n);
			for(int i=0;i<n&&k;++i){
				if(a[i]<0){
					--k;
					a[i]*=-1;
				}
				else
					break;
			}
			if(k%2){
				long long int ma=10000000,mit=-1;
				for(int i=0;i<n&&ma;++i){
					if(a[i]<ma){
						ma=a[i];
						mit=i;
					}
				}
				a[mit]*=-1;
			}
			for(int i=0;i<n;++i)
				ans+=a[i];
			cout << ans << "\n";
		}
	}
}

Discussion