ACM竞赛学习记录------权力指数(枚举)

本文介绍了ACM竞赛中的一道题目,要求计算每个小团体作为"关键加入者"的次数,即权利指数。通过枚举方法,将每个小团体从联盟中移除并检查剩余联盟是否仍能构成"获胜联盟"。如果不能,说明该小团体是关键加入者,其权利指数增加。提供了解题思路和AC代码,其中关键操作是将小团体移到数组末尾以便于枚举。
摘要由CSDN通过智能技术生成

题目链接:https://vjudge.net/problem/HDU-1557
题目: 在选举问题中,总共有n个小团体,每个小团体拥有一定数量的选票数。如果其中m个小团体的票数和超过总票数的一半,则此组合为“获胜联盟”。n个团体可形成若干个获胜联盟。一个小团体要成为一个“关键加入者”的条件是:在其所在的获胜联盟中,如果缺少了这个小团体的加入,则此联盟不能成为获胜联盟。一个小团体的权利指数是指:一个小团体在所有获胜联盟中成为“关键加入者”的次数。请你计算每个小团体的权利指数。
Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每一组测试数据的第一行为一个正整数n(0<n<=20)。第二行有n个正整数,分别表示1到n号小团体的票数。
Output
对每组测试数据,在同一个行按顺序输出1到n号小团体的权利指数。
Sample Input

2
1
10
7
5 7 4 8 6 7 5

Sample Output

1
16 22 16 24 20 22 16

题目大意:就是求每个小团体作为“关键加入者”的次数。
解题思路:我们使用枚举的方法。假设我们想要求第n个小团体的权力指数,我们就将这个小团体提取出来,让剩下的小团体进行组合(枚举出所有可能的组合),每枚举出一种组合我们都进行判断,若该组合的票数不超过总票数一半但加上第n个小团体的票数后就超过总票数一半,则第n个小团体的权力指数加一,以此类推,枚举所有的小团体即可。

AC代码:(代码中将某个小团体提取出来的方法是将该小团体放到数组最后)

#include <cstdlib>
#include <iostream>
using namespace std;
int n, num[20], answer[20],team;
int total;
//end还要递归层数
void sun(int start,int end,int now) {
   
    //最后一层递归
    if (end == 1) {
   
       
            if (now<=<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值