http://acm.hdu.edu.cn/showproblem.php?pid=1557
Problem Description
在选举问题中,总共有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
#include <iostream>
using namespace std;
int main()
{
int t, n, a[25], i, key[25], k, total, ans[25];
scanf ("%d", &t);
while (t--)
{
memset (ans, 0, sizeof(ans));
total = 0;
scanf ("%d", &n);
for (i = 0; i < n; i++)
scanf ("%d", a+i), total += a[i];
total /= 2; //总票数的一半【写成total = (total+1)/2 会错……】
//枚举子集【1】~【2的n次方-1】
int maxs = 1 << n;
for (i = 1; i < maxs; i++)
{
k = 0;
int tp = i, j = 0, sum = 0;
while (tp)
{
if (tp & 1)//tp的二进制从左往右数第j位是1,则认为a[j]入了集合
key[k++] = j, sum += a[j];
//记住入了集合的a的元素编号j,并累加票数
tp >>= 1; //tp的二进制往右移动,即消去二进制最后一位
j++;
}
if (sum > total) //如果团体的票数超过总票数的一半
for (j = 0; j < k; j++)
if (sum - a[key[j]] <= total)
ans[key[j]]++;
//如果没了a[key[j]]就不行,则编号为key[j]的元素为“关键加入者”,该元素权利指数+1
}
printf ("%d", ans[0]);
for (i = 1; i < n; i++)
printf (" %d", ans[i]);
printf ("\n");
}
return 0;
}
深搜:
#include <iostream>
using namespace std;
int con[25], ans[25], total, n, a[25], key; //con存放a中元素编号
bool visited[25];
void dfs (int x, int sum, int times)//x是元素编号,sum是临时和,times是con中元素个数
{
if (times == key)
{
if (sum > total)
for (int i = 0; i < times; i++)
if (sum - a[con[i]] <= total)
ans[con[i]]++;
return ;
}
for (int i = x + 1; i < n; i++)
{
con[times] = i;
dfs (i, sum+a[i], times+1);
}
}
int main()
{
int t, i;
scanf ("%d", &t);
while (t--)
{
scanf ("%d", &n);
total = 0;
for (i = 0; i < n; i++)
scanf ("%d", a+i), total += a[i];
total /= 2;
memset (ans, 0, sizeof(ans));
for (key = 1; key <= n; key++) //枚举获胜联盟中团体个数
{
memset (visited, false, sizeof(visited));
visited[0] = true;
dfs (-1, 0, 0);
}
for (i = 0; i < n - 1; i++)
printf ("%d ", ans[i]);
printf ("%d\n", ans[n-1]);
}
return 0;
}
分享到:
相关推荐
示例 1:输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输出:[[],[0]]解题思路:数组中的每一个数字
基于二进制作用模糊子集推理单片机模糊控制的发展.doc
将6bit二进制转换为ASCII码,将ASCII码转换为6bit二进制
将二进制引入关联规则求解中,充分利用二进制操作方便、运算速度快、节省空间的优势。在求解事务项集真子集和支持度时,对事务数据库中相同事务只求解一次,并给出了真子集的具体求解算法。本算法一次扫描数据库可以...
在二进制特征选择中,每个候选特征子集都可以用一个二进制编码来表示,其中每一位对应一个特征是否被选中。以下是使用GA进行二进制特征选择的一般步骤: 编码:将特征选择问题转化为一个二进制编码的优化问题。假设...
二分法二进制搜索 C ++ 二分法二进制搜索 C 构建宏 C 调试宏 C ++ 延迟宏,转到样式 C ++ 目录清单 C 小型YAML子集配置文件解析器 重击 双重bash /批处理文件 C 字节顺序转换 C 错误处理 C 紧...
课程设计题目:一个PASCAL语言子集(PL/0)编译器的设计与实现。有源程序和报告。
1.1.5 Win32子集 1.2 仍然是Windows编程 1.3 第一个WindowsCE应用程序 1.3.1 创建第一个WindowsCE应用程序 1.3.2 运行程序 1.3.3 出了什么问题 1.4 Hello2程序 1.5 剖析窗口应用程序 1.5.1 窗口 1.5.2 窗口类 1.5.3 ...
C/C++语言编程安全子集
子集和问题的一个实例为?St?〈St〉。其中,S={x1,x2,…,xn}S={x1,x2,…,xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在 S 的一个子集 S1,使得 ∑x∈S1x=c ∑x∈S1x=c。试设计一个解子集和...
贝岭的matlab的代码Caml-Est-Belle ...在compiler/文件夹中运行命令make将创建三个二进制文件: mincamlc是编译器二进制文件,将 MinCaml 文件编译成 ARM 汇编文件。 armgen是后端二进制文件,将 ASML
最后,将基因灵敏度信息编码进二进制微粒群优化算法作进一步基因选择。在两个公开的微阵列数据集上的实验结果表明,对比其他方法,由于充分考虑各个基因灵敏度信息,因此能够选出较少基因但分类性能更高的基因子集。
二进制粒子群优化算法主代码, 其中bpso_project函数为特征子集评价函数, 对接自己的数据集与评价函数即可使用。
二进制数x64的前后一个数,相当于在x64尾数的最后一位加1或减1,故x64与最近的数之间的距离为0.5^52 ,另外指数位会将尾数放大了2^n倍,故最终x的精度为0.5*2^(n-52)(注意必须乘以0.5,原因如上)。故在±0.5*2^(n-...
编译器一个用python编写的c ++语法子集的玩具编译器需要python3,antlr4,antlr4-python3-runtime 在以下说明中,您可以在环境中将python3替换为python,将pip3替换为pip 要安装antlr4-python3-runtime,请运行pip3 ...
C/C++ 的一个子集,+更多,像 Rust 一样重新语法。 在 C++ 中实现。 '$ make' 编译和运行内置测试 '$ ./hack -r example.rs' 编译和运行示例程序。 请参阅“example.rs”示例源; 还没有名字,因此“黑客”.. ...
3. 常数:包括整数和实数(包括十进制小数形式,如1.23和指数形式如1.2e5或1.2E5) 4. 运算符:如= + - * / < <= > >= == != 等符号 5. 分隔符:; { } 等符号 程序输入/输出示例: 如源程序为C语言程序test.c: main...
此函数可以读取压缩二进制、未压缩二进制和 ASCII 文件格式。 在压缩二进制的情况下,数据使用快速二次点插入自动解压缩。 此功能可以有效地处理非常大的二进制仿真文件,并且可以选择仅加载文件波形的子集以减少...
编写bint的目的是从基因分型分析中获得强度数据的子集。 用于创建聚类图的X和Y... bint将强度浮点数据的文本表示形式转换为IEEE754索引的二进制文件,以快速提取数据的子集。 理论上,bint可用于任何大的float数据表。