二进制法枚举集合——权利指数 HDU1557

ACM竞赛学习记录------权力指数(枚举) 题目链接:https://vjudge.net/problem/HDU-1557 题目: 在选举问题中,总共有n个小团体,每个小团体拥有一定数量的选票数。如果其中m个小团体的票数和超过总票数的一半,则此组合为“获胜联盟”。n个团体可形成若干个获胜联盟。一个小团体要成为一个“关键加入者”的条件是:在其所在的获胜联盟中,如果缺少了这个小团体的加入,则此联盟不能成为获胜联盟。一个小团体的权利指数... 阅读详情

                                                      权利指数

在选举问题中,总共有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个小团体之间可以任意组合成一个大团体;如果一个大团体占了所有团体总和的50%就是好团体;

如果一个小团体能够在好团体中站至少50%的比例,就叫他关键加入者;

求一个小团体能成为关键加入者的次数;

题目真TMD绕。。。

首先肯定要把所有的好团体求出来,那么只能枚举出所有的成大团的所有情况;

这里用到二进制法枚举集合,具体内容如下:

把下面的代码,运行一下,自己理解……

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
 
void print_subset(int n,int s)
{
    for(int i=0;i<n;i++)
    {
        if(s&(1<<i))
            printf("%d ",i);
    }
    printf("\n");
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<(1<<n);i++)
        print_subset(n,i);
    return 0;
}

如果输入3:

输出如下:

0,

1,

0,1

2,

0,2

1,2

0,1,2

发现其实就是0,1,2的所有非空真子集;

这样就达到了枚举子集的目的;

枚举出所有的集合之后判断一下这个集合是否满足优秀集体;再判断一下每个个人是否是优秀个人即可;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e6+5;
int n,m;
int ans[maxn];
int a[maxn];
int subset(int x)
{
    int sum=0;
    for(int i=0;i<n;++i)
    {
        if(x&(1<<i)) sum+=a[i];
    }
    return sum;///枚举出了一种子集的全部和
}
int main()
{
    int fuck;
    cin>>fuck;
    while(fuck--)
    {
        int cnt=0;///总票数
        memset(ans,0,sizeof ans);
        scanf("%d",&n);
        for(int i=0;i<n;++i)
            scanf("%d",&a[i]),cnt+=a[i];
        for(int i=1;i<(1<<n);++i)///枚举所有的集合
        {
            int sum=subset(i);///当前子集的所有和
            for(int j=0;j<n;++j)
            {
                if(i&(1<<j)) ///判断a[j]是否在sum中
                {
                    if(sum*2>cnt&&(sum-a[j])*2<=cnt) ++ans[j];
                }
            }
        }
        for(int i=0;i<n;++i)
        {
            printf("%d",ans[i]);
            if(i!=n-1) printf(" ");
            else puts("");
        }
    }
    return 0;
}

别再花屏了!手把手教你用STM32CubeIDE搞定LVGL 8.3移植(附完整源码) 本文详细介绍了如何在STM32CubeIDE环境下成功移植LVGL 8.3,解决常见的花屏问题。从环境配置、显示驱动优化到编译警告处理,提供完整的实战方案和源码示例,帮助开发者快速实现流畅的嵌入式GUI界面。特别针对STM32平台的DMA2D加速和内存管理进行了深度优化。 阅读详情

相关推荐

金融波动预测:GARCH模型实战解析与ARIMA对比

本文深入解析GARCH模型在金融波动预测中的实战应用,并与传统ARIMA模型进行对比。通过沪深300指数日收益率数据的案例分析,展示GARCH模型如何有效捕捉波动聚集效应,提升极端波动预测准确率。文章包含Python代码实现、参数解读及模型选择指南,为量化交易者提供实用的波动率建模解决方案。

weixin_29098367的博客 189

hdu 1557 权利指数

权利指数 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 418    Accepted Submission(s): 285 Problem Description 在选举问题中,总共有n个小团体,每个小团体拥有

喵呜的Blog 1366

Unity海康视屏对接

通过对接海康SDK,获取视屏流回调。经过解码得到YUV格式的图片,最后通过Shader把YUV数据显示出来。也可以通过Rtsp协议,直接获取视屏流显示。这个貌似Unity中已经有插件支持了,UMP。------2018.4.20using UnityEngine;using System.Collections;using System;using UnityEngine.UI;using Sys...

Witness_K的博客 2028

权利指数(hdu 1557)

此题链接单击这里=================此题只要枚举出所有子集即可AC~~~~~好吧,关键就是怎么枚举子集。。。 做此题之前根本不知道怎么枚举子集,把紫书(刘汝佳著)子集生成一节看几遍,最后用二进法做此题(就看懂了这个~~~)。 二进制法枚举子集: n个数有2^n个子集,每个子集对应一个二进数,每位二进制对应一个数。二进制的位权为0表示子集不包含那个数,二进制的位权为1表示子集

Folieshell的博客 1022

VMware17安装教程(附安装包)VMware17小白详细一键安装教程

VMware 17.5 是一款强大的虚拟机软件。本安装教程将为您详细介绍VMware17安装教程其下载、安装步骤及验证方法,助您轻松完成安装,开启虚拟化体验。

2501_91538706的博客 2万+

大疆A型板使用经验分享(二)——A型板原理图和引脚图

一.原理图 二.引脚图

weixin_43361652的博客 7681

HDU-1557权力指数(二进制枚举)

很经典的模拟每一种情况的代码 对于每一种情况 我们用数组来存储着一情况下 1 的票数。接着遍历全部情况 如果某种情况下的得票数大于总票数的一半 这些1就是获胜联盟。很容易可以知道有(1<<n)中情况 枚举每一种情况 可以得到答案。第二个for循环查找此位置是否是1 去掉他是否不再是获胜联盟。预处理这个过程 得到 state 每一种情况下 得到的票数。每个小团体要么是投票 要么不投票(方便理解)如果满足 对应的ans++就行了。可以用二进制来模拟谁投票。比如0111 0000。

2301_80328768的博客 458

华为OD机试 - 名字的漂亮度(Java 牛客练习题)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。给出一个字符串,该字符串仅由小写字母组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。给出多个字符串,计算每个字符串最大可能的“漂亮度”。第一行一个整数N,接下来N行每行一个字符串。数据范围:输入的名字长度满足。每个字符串可能的最大漂亮程度。

学Java,找哪吒 1786

集合的整数表示(二进制枚举)

集合的整数表示(二进制枚举) 原理 对于集合{0,1,2,3…,n-1}的子集:如{0}、{0,1}、{0,1,2 }… 总共有2n个:因为C(n,0)+C(n,1)…+C(n,n)=2n,即1<<n个 可以用1<<n的二进制码中1与0枚举它们 1代表集合中有 0代表集合中没有 使用方法 运算规则 表示形式 空集Φ\PhiΦ 0 只含有第i个元素的集合{i} 1<<i 含有全部n个元素的集合{0,1,2…,n-1} (1<<n

meet snow happy 691

【RKNN】RKNN(Rockchip Neural Network)​​ 的详解

RKNN 为 Rockchip 硬件提供了高效的 AI 推理解决方案,适合需要低功耗、实时响应的边缘场景

浩瀚之水的专栏 1684

弹窗提示报错: F:\c\CFX5\bin\Debug\net9.0-windows10.0.26100.0\CFX5.dll 面向无法动态枚举工具箱项目的平台...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 947

二进制枚举算法

也就是只有0和1的进制表示;

ros275229的博客 967

Java使用POI生成柱状图导出到word文档(柱状图)

本篇文章主要介绍,如何使用Apache POI组件生成柱状图导出到word文档中,具体步骤看下文。 一、实现效果 Java使用POI技术生成柱状图导出到word文档中,最终生成的柱状图如下所示: 二、环境准备 编程语言:Java 第三方依赖:Apache POI Apache POI依赖代码如下所示: <dependencies> <dependency> <groupId>org.apache.poi</groupId.

✅ Java 开发工程师 7371

二进制枚举以及集合的关系运算

子集:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集。 子集的个数:含 n 元素的子集的个数为 **$2^n$**

qq_63786973的博客 768

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

选举

实验七 数组(二)—选举 【问题描述】 在一场全国性选举中,有n位候选人,编号从1~n,这个国家有m个城市,已知每个城市每个候选人的得票数。 这个国家的选举制度很不寻常。在选举的第一阶段,每个城市的票数被计算出来,在每个城市,获胜者为得票最多的候选人,如果有相同得票数,则编号最小的获胜。 在第二个阶段,比较赢得的城市数,赢得的城市最多者获胜,如果赢得的城市数相等,则编号小者获胜。请确定最终谁将获得...

nzbm_的博客 2008

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

hdu 1557 权利指数 ( 二进制枚举子集) 解题心得

原题: Description 在选举问题中,总共有n个小团体,每个小团体拥有一定数量的选票数。如果其中m个小团体的票数和超过总票数的一半,则此组合为“获胜联盟”。n个团体可形成若干个获胜联盟。一个小团体要成为一个“关键加入者”的条件是:在其所在的获胜联盟中,如果缺少了这个小团体的加入,则此联盟不能成为获胜联盟。一个小团体的权利指数是指:一个小团体在所有获胜联盟中成为“关键加...

advyne9986的博客 543

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

枚举集合--二进制法

二进制枚举子集: 1.从最右边开始,代表的数字都是从0开始,1代表该数字在集合中,0代表该数字不在集合中。 2.二进制运算: 二进制中的按位与,或,异或对应集合运算的交,并,对称差。 3.一般将全集定义为ALL_BITS=(1 枚举集合(1,2,.......n-1) #include #include #include #include using namespace std

shao1996的博客 2864

二进制枚举--最通俗易懂的讲解

二进制:是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二” 子集:是一个数学概念:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集。 含有个元素的集合的一切子集的个数为。简单证明一下: 含有0个元素的子集有个, 含有1个元素的子集有个, 含有2个元素的子集有个, ............

sugarbliss 2万+

二进制枚举子集

思路: 利用二进制的“开关”特性枚举; 具体为:假设给定集合A大小为n,则想象A = {a[0], a[1], ..., a[n-1]}的每个元素对应一个开关位(0或1),0表示不出现,1表示出现; 当每个元素的开关位的值确定时,就得到一个子集,因此共有2^n-1种情况(全0为空集,这里不考虑); 我们利用区间[1, 2^n-1],该区间上的每一个整数对应一个子集,对应方法是遍历该整数二进制表

ooon 4670

东北林业大学acm大一培训(五)(二进制与枚举)

算数位运算: 1、与(&): 对于指定的两个数A=60(0011 1100) B=13(0000 1101) 执行一下操作 A&B=12(0000 1100) 就是对二进制每一位进行了一次与操作,同为1,结果为1,否则为0 2、或(|): 对于指定的两个数A=60(0011 1100) B=13(0000 1101) 执行一下操作 A|B=61(0011 1101) 就是对二进制每一位进行了一次或操作,同为0,结果为0,否则为1 3、非 按位取反(~): 对于指定的一个数A=60

沉晨尘宸的博客 464

技巧-二进制枚举

题目: 第一行,输入两个整数 n,X(1≤n≤20,1≤X≤2000)n,X(1 \leq n \leq 20, 1 \leq X \leq 2000)n,X(1≤n≤20,1≤X≤2000)。 接下来输入 nn 个整数,每个整数不超过 100100。 输出一个整数,表示能凑出 XXX 的方案数。 方法:二进制枚举。用一个enums数组表示状态。enum[i]为1就表示取用第i个数

Reast1nPeace的博客 565

二进制枚举子集的方法

//枚举S的子集 for (int x = S; x; x = (x-1)&S)

Frozensmile的博客 758

二进制枚举的实现

二进制枚举 ………….. //二进制枚举 void subset(bool vis[],int&amp; n){ for(int i=0;i&lt;(1&lt;&lt;n);i++){ memset(vis,0,sizeof(vis)); for(int j=0;j&lt;n;j++){ if(i&amp;(1&lt;&lt;...

siyu 832

hdu 4333 A very hard Aoshu problem (二进制枚举)

题目链接:哆啦A梦传送门 题意:给你一串字符串,让你从中添加一个‘=’,任意个‘+’,使得满足等式。问:有多少中不同的方式? 题解:我们可以二进制枚举,1表示此位置取‘+’,0表示不取。 #include&lt;cstdio&gt; #include&lt;algorithm&gt; #include&lt;cstring&gt; using namespace std; char o...

Jiandong 304

二进制枚举法(常用!!)

#include using namespace std; int main() {     int n;     cin>>n;     for(int i=0;i     {         for(int j=0;j         {             if(i>>j&1)             {                 cout  

Little_boy_z的博客 436

acm新手小白必看系列之(4)——超级简单的二进制枚举精讲及例题

acm新手小白必看系列之(4)——超级简单的二进制枚举精讲及例题 - 二进制操作(事前须知) (还有排列组合知识要知道,比如n个数的子集个数是2的n次幂) 算数位运算: 1、与(&): 对于指定的两个数A=60(0011 1100) B=13(0000 1101) 执行一下操作 A&B=12(0000 1100) 就是对二进制每一位进行了一次与操作,同为1,结果为1,否则为0 ...

永恒之蓝的博客 2514
上一篇: 母函数——秤砣问题——The Balance
下一篇: hdu 5750 数论
鸭脖yb
博客等级 码龄9年 15粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值