1899: 985的最大和難題
Time Limit: 1 Sec Memory Limit: 128 MBDescription
985有2 * n - 1個整數,他每次可以將其中n個數變號,操作次數不限,問他可以得到的最大和。
Input
第一行輸入一個整數t,代表有t組測試數據。
每組數據佔兩行,第一行輸入一個整數n,下面一行輸入2*n-1個整數a[]。
注:1 <= t <= 32,1 <= n <= 1e3,-1e3 <= a[] <= 1e3。
Output
輸出一個整數代表可以得到的最大和。
Sample Input
2 2 1 1 1 2 -10 20 -10
Sample Output
3 40
n=3時的負數變化
(0爲負數1爲正數)
有一個:
0 1 1 1 1
1 0 0 1 1
1 0 1 0 0
1 1 1 1 1
有兩個:
0 0 1 1 1
0 1 0 0 1
1 1 1 1 1
有三個:
0 0 0 1 1
1 1 1 1 1
總結規律:
負數 | 正數 |
0 | 2n-1 |
n | n-1 |
1 | 2n-2 |
n-1 | n |
3 | 2n-4 |
n-3 | n+2 |
…… | …… |
可發現若n爲奇數時
總可以把負數全部變爲正數
當n爲偶數時
每次能改變偶數個負數
所以若負數的個數爲偶數個
也能全部變爲正數
當負數的個數爲奇數個
總會留下一個數爲負數
(但不一定是原來就有的負數)
爲了讓總和最大
可以使絕對值最小的數爲負數
#include<stdio.h>
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n;
scanf("%d",&n);
int l=2*n-1;
int sum=0,cnt=0,res=99999999;
for(int i=0; i<l; i++) {
int t;
scanf("%d",&t);
if(t<0) {
cnt++;
t=-t;
}
if(res>t)
res=t;
sum+=t;
}
if(n&1||cnt%2==0)
printf("%d\n",sum);
else
printf("%d\n",sum-2*res);
}
return 0;
}
題目地址:【鄭輕】[1899]985的最大和難題