题目描述
问题描述:
X国的重大决议都是通过议会投票通过,议会里面投票者被分成K个组,如果超过半数的组投赞成票,决议就可以通过。 每组是投赞成票还是反对票也由每组内部投票决定,若这一组有超过半数的人投赞成票,那么这一组就投赞成票。
例如有3组,分别有5,7,5人,那么,至少要有6个人赞成决议才能通过(即第一组和第三组各三人)。 注意到共有17人,只需要6人赞成就有可能通过。
编写程序,告诉你组数和每组的人数,计算通过决议至少需要多少人赞成。
输入
输入格式:
共两行。
第一行:一个整数K,(K<=15);表示组数;
第二行:共K个整数,分别表示每组的人数。K以及每组的人数都是奇数。总人数不超过1001。
输出
输出格式:
一行,决议通过至少所需的人数。
样例输入
3
5 7 5
样例输出
6
思路:感觉套路有点像贪心,先取票数最少的那组,标记上,然后再穷举法求剩下的最小的那组,标记上,直到满足组数超过半数
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] f = new int[n];
boolean[] falgs = new boolean[n];
int count = 0;//表示有多少个组赞成
int min = Integer.MAX_VALUE; //最少的组
int all = 0;//记录总票数
int mins = 0;
for (int i = 0; i < n; i++) {
f[i] = sc.nextInt() / 2 + 1;//取一半,因为都是奇数,所以+1
if (min > f[i]) {
min = f[i];
mins = i;
}
}
falgs[mins] = true;
all += min;
count++;
min = Integer.MAX_VALUE;
while (true) {
if (count == n / 2 + 1) {
break;
}
for (int i = 0; i < f.length; i++) {
if (!falgs[i]) {
if (min > f[i]) {
min = f[i];
mins = i;
}
}
}
falgs[mins] = true;
all += min;
min = Integer.MAX_VALUE;
count++;
}
System.out.println(all);
}
}