最近写了这道题,发现网上的题解还是有不少问题的,没有一个自己满意的(考虑问题有些不全面),所以自己写了一个题解(有问题欢迎指正。。。)完全贪心
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定:
1)N个正整数A1, A2, ... AN;
2)P个加号+和Q个减号-; (P+Q=N-1)
3)K对括号()
请你使用全部整数、加减号和括号,组成一个合法的算式(A1~AN在算式中的顺序随意),使得算式的结果最大。
注意加减号只能作为二元运算符出现在算式中,不能作为正负号。
括号可以出现在算式最左和最右,例如(((1+2)))是合法的。
例如对于样例数据,(2-1)+3或3+(2-1)等都是结果最大的算式。
输入
第一行包含4个整数,N,P, Q和K。
第二行包含N个整数A1, A2, ... AN。
2 ≤ N ≤ 100 P+Q+1=N 0 ≤ K ≤ 10
1 ≤ Ai ≤ 1000
输出
最大算式结果
样例输入
3 1 1 1
1 2 3
样例输出
4
package com.xiaonei;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n=sc.nextInt();
int p=sc.nextInt();
int q=sc.nextInt();
int k=sc.nextInt();
int b[] = new int [n];
int a[] = new int [n];
for (int i = 0; i < n; i++) {
b[i]=sc.nextInt();
}
Arrays.sort(b);
int c=n-1;
for (int i = 0; i < n; i++) {
a[i]=b[c];
c--;
}
int sum=0;
if(k==0){ //无括号
for (int i = 0; i < n; i++) {
if(i<=q)
sum-=a[i];
else
sum+=a[i];
}
}
else{ //有括号
if(q==0){
for (int i = 0; i <n; i++)
sum+=a[i];
}
else if(q==1){
for (int i = 0; i <n-1; i++) {
sum+=a[i];
}
sum-=a[n-1];
}else{
int m=a[n-1];
for (int i = n-2; i>=n-1-q;i--) {
m-=a[i];
}
for (int i = n-2-q; i >=0 ; i--) {
sum+=a[i];
}
sum=sum-m;
}
}
System.out.println(sum);
}
}
}