`
kmplayer
  • 浏览: 512054 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

UyHiP趣题:限制最苛刻的选票统计程序

阅读更多
【转载】http://www.matrix67.com/blog/archives/4228
一个国家里有 N 个公民,这些公民从 1 到 N 依次编号。这是一个民主国家,国家做出的每个决定都需要全体公民投票,每个人必须且只能投一票。

    不过,随着该国家人口数量的增加,这种投票方式的效率越来越低。于是,这个国家实行了一种新的民主制度。每过四年,这个国家将会举行一次“代表选举大会”,届时,每个公民都必须且只能提名一个他信得过的人,来作为他自己的代表。注意,提名自己作为自己的代表也是允许的。对于每个被提名了的人,有百分之多少的人提名他,他就拥有了相当于多少张选票的权力(向下取整)。在接下来的四年里,国家要做出某项决定时,就只需要这些代表来参加了。

    比方说,这个国家有 200 个人,在代表选举大会上,有 98 个人提名 1 号公民当代表,有 101 个人提名 2 号公民当代表,有 1 个人提名 200 号公民当代表。结果就是,只有 1 号公民和 2 号公民成为代表,在接下来的四年里参与投票,其中 1 号公民一票当 49 票,2 号公民一票当 50 票。值得注意的是, 200 号公民虽然有提名,但支持率仅 0.5% ,因此他今后四年没有当代表的权力。


    为了支持新的民主政策,你需要设计一套算法,来计算每届代表选举大会结束后,哪些公民成为了代表,他们手中各自有多少票的权力。程序的输入数据来源于一盘磁带。磁带上有 N 个数,分别记录了这 N 个公民各自提名的代表的编号(由于提名是匿名的,磁带上的数据不是顺序的,你无法判断出每个数都是谁的)。程序可以多次读取磁带,但是每次都只能是从头到尾依次读取每一个数。由于这个国家的人数已经增加到了一定规模,因此你的程序必须非常高效。具体地说,你的算法必须要满足以下几点限制:

    1. 你的程序读取磁带的次数要尽可能的少;

    2. 磁带是只读的;

    3. 程序可以在自己的内存里储存变量,不过只能使用 O(1) 个单元的空间(即所耗费的内存空间与 N 无关);

    4. 内存里每个单元的空间只能储存 0 到 N 之间的整数(包括 0 和 N );

    5. 预处理阶段完成后,程序将进入询问阶段,即针对形如“公民 x 获得了多少票的权力”的问题给出回答。一旦预处理完成进入询问阶段后,程序就不能再接触磁带了。

    现在的问题是,在最坏情况下,最少需要读取多少次磁带?给出一个满足要求的算法,并证明读取磁带的次数已经不能再少了。

    答案:最少需要读取两次磁带。

    首先我们来说明,读取一次磁带是不够的。假设 N 是 100 的某个很大的倍数。磁带前面有 (N/2) + 50 个互不相同的数。磁带后面则又是 50 个不同的数,其中每个数都出现了 (N/100) - 1 次,从而恰好填充满整个磁带。注意,出现了 (N/100) - 1 次就意味着,再多出现一次就能成为代表了。因此正确的输出结果就是,如果这 50 个人中有人正好也在磁带前半部分出现过,则他将获得一票的代表权力。因此,如果程序想要一次读带就完成任务,在读完前 (N/2) + 50 个数之后,它必须要能记住哪些数出现过哪些数没出现过,这显然无法用 O(1) 的空间存下。这就说明,仅用一次磁带是不够的。
引用
这里 (N/2) + 50 + ((N/100) - 1)*50 = N 挺巧妙的证明

    如果允许读磁带两次,我们有下面这个算法。

    首先,通读一遍磁带,同时维护一个“谁谁谁目前都得到了多少次提名”的表(没有被提名的人就不用写进表里了)。为了保证内存空间在常数级别,我们引入“裁减”操作:只要表里的人数达到 100,就让所有代表都减少一个提名。这样的话,必然有人又会变成“零提名”,从而让表里的人数回到 100 以下。每当表里的人数达到 100 时,我们都进行一次裁减操作,除非我们正好处理完最后一个提名。

    现在我们证明,最后没有留在表中的人,都绝不可能成为代表。反证,假设某人得到了 x ≥ N/100 次提名,但最后却没有留在表中。由于一次裁减只能让他失去一个提名,因此读取磁带的过程中至少发生了 x 次裁减。每次裁减都会裁掉 100 个提名,因此整个过程中至少有 100x 个提名被裁掉了。但我们一共就只有 N 个提名,而且最后一个提名是肯定不会被裁掉的,因此 100x 必然严格地小于 N 。这与 x ≥ N/100 矛盾。因此,所有有可能成为代表的人都已经留在表里了。

    接下来就容易了。再从头至尾读一遍磁带,并且记录每个代表真正的提名次数。只不过这一次,我们只为上一轮最后还留在表里的那些人做记录。第二轮磁带读完后,我们便能算出每个代表拥有的权力了。
分享到:
评论

相关推荐

    VB控制计算机并口示例(含完整可以运行源代码)

    VB控制计算机并口示例(含完整可以运行源代码) 可以通过并口直接控制MCU,做SW控制不错,关键还可以学习并口硬件控制学习。含详细源代码哦

    python毕业设计基于PyTorch的手语识别系统源码+数据集(完整项目代码)

    python毕业设计基于PyTorch的手语识别系统源码+数据集(完整项目代码),本资源中的源码都是经过本地编译过可运行的,评审分达到98分,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、毕业设计、期末大作业和课程设计使用需求,如果有需要的话可以放心下载使用。 python毕业设计基于PyTorch的手语识别系统源码+数据集(完整项目代码)python毕业设计基于PyTorch的手语识别系统源码+数据集(完整项目代码)python毕业设计基于PyTorch的手语识别系统源码+数据集(完整项目代码)python毕业设计基于PyTorch的手语识别系统源码+数据集(完整项目代码)python毕业设计基于PyTorch的手语识别系统源码+数据集(完整项目代码)python毕业设计基于PyTorch的手语识别系统源码+数据集(完整项目代码)python毕业设计基于PyTorch的手语识别系统源码+数据集(完整项目代码)python毕业设计基于PyTorch的手语识别系统源码+数据集(完整项目代码)python毕业设计基于PyTorch的手语识别系统源码+数据集(完整项目代

    基于Unet的树种分别识别模型

    基于Unet的树种分别识别模型

    精选毕设项目-富文本解析,折线图,MD5,bluebird.zip

    精选毕设项目-富文本解析,折线图,MD5,bluebird

    图书管理系统(基于ASP .NET)

    《图书管理系统(基于ASP .NET)》是一款专为学习者设计的应用程序,旨在提供一个全面的图书管理平台。系统的设计采用ASP .NET技术,这是一款由微软开发的用于构建动态网站、web应用和web服务的强大工具。ASP .NET框架以其高效、安全和易于维护的特点,深受开发者的喜爱。 该系统包含了多个核心模块,这些模块覆盖了图书管理的主要功能。有图书录入模块,它允许管理员录入图书的基本信息,如书名、作者、出版社、ISBN号、分类等。图书查询模块提供给用户方便快捷的搜索功能,用户可以根据书名、作者、关键词等条件进行检索。此外,借阅与归还模块确保图书的流通管理,记录图书的借阅状态,提醒用户按时归还,并处理超期罚款等事务。 系统还具备用户管理模块,允许用户注册、登录、修改个人信息。对于权限管理,后台有专门的管理员角色,他们可以对用户进行操作,如分配权限、冻结或解冻账户。同时,系统的统计分析模块能够生成各类报表,如图书借阅量、热门书籍、用户活跃度等,这些数据对于图书馆运营决策有着重要参考价值。 在。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    精选毕设项目-查拼音.zip

    精选毕设项目-查拼音

    精选毕设项目-音乐在线歌词搜索.zip

    精选毕设项目-音乐在线歌词搜索

    思维导图制作-会计初级知识重难点-会计务实-所有者权益

    本专刊的主要目的是帮助初学者系统化和结构化地掌握会计知识。我们采用思维导图的形式,将复杂的会计概念和流程进行有效的简化,旨在让学习者能够更清晰地理解这些内容,并增强记忆效果。通过视觉化的方式,读者不仅能够感受到会计知识的关联性,还能轻松掌握关键点,提升学习效率。无论是在学习新知识还是复习旧知识时,这种方法都能够为学习者提供极大的便利和帮助。

    配网两阶段鲁棒优化调度模型 关键词:两阶段鲁棒优化,CCG算法,储能 仿真算例采用33节点,采用matlab+yalmip+cplex编写,两阶段模型采用CCG算法求解 模型中一阶段变量主要包括01

    配网两阶段鲁棒优化调度模型 关键词:两阶段鲁棒优化,CCG算法,储能 仿真算例采用33节点,采用matlab+yalmip+cplex编写,两阶段模型采用CCG算法求解。 模型中一阶段变量主要包括01变量和无功优化变量,核心变量主要存在于二阶段,因此在叠加二阶段变量优化过程中更容易得到最优解,所以有限次迭代即得到收敛的结果。 模型以网损为目标,包括功率平衡、网络潮流、电压电流、蓄电池出力以及无功设备出力等约束。 复现《两阶段鲁棒优化的主动配电网动态无功优化》-熊壮壮,具体内容可自行下载了解。

    1..1行列式的定义.ppt

    1..1行列式的定义.ppt

    精选毕设项目-地图定位.zip

    精选毕设项目-地图定位

    MMC整流器平均值模型simulink仿真,19电平,采用交流电流内环,直流电压外环控制,双二阶广义积分器锁相环,PI解耦环流抑制器,调制方式为最近电平逼近调制,完美运行 波形一二为直流侧电压电流

    MMC整流器平均值模型simulink仿真,19电平,采用交流电流内环,直流电压外环控制,双二阶广义积分器锁相环,PI解耦环流抑制器,调制方式为最近电平逼近调制,完美运行。 波形一二为直流侧电压电流,波形三四分别为主控制器及环流抑制器输出调制信号。

    疫苗发布和接种预约系统-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip

    Spring Boot是Spring框架的一个模块,它简化了基于Spring应用程序的创建和部署过程。Spring Boot提供了快速启动Spring应用程序的能力,通过自动配置、微服务支持和独立运行的特性,使得开发者能够专注于业务逻辑,而不是配置细节。Spring Boot的核心思想是约定优于配置,它通过自动配置机制,根据项目中添加的依赖自动配置Spring应用。这大大减少了配置文件的编写,提高了开发效率。Spring Boot还支持嵌入式服务器,如Tomcat、Jetty和Undertow,使得开发者无需部署WAR文件到外部服务器即可运行Spring应用。 Java是一种广泛使用的高级编程语言,由Sun Microsystems公司(现为Oracle公司的一部分)在1995年首次发布。Java以其“编写一次,到处运行”(WORA)的特性而闻名,这一特性得益于Java虚拟机(JVM)的使用,它允许Java程序在任何安装了相应JVM的平台上运行,而无需重新编译。Java语言设计之初就是为了跨平台,同时具备面向对象、并发、安全和健壮性等特点。 Java语言广泛应用于企业级应用、移动应用、桌面应用、游戏开发、云计算和物联网等领域。它的语法结构清晰,易于学习和使用,同时提供了丰富的API库,支持多种编程范式,包括面向对象、命令式、函数式和并发编程。Java的强类型系统和自动内存管理减少了程序错误和内存泄漏的风险。随着Java的不断更新和发展,它已经成为一个成熟的生态系统,拥有庞大的开发者社区和持续的技术创新。Java 8引入了Lambda表达式,进一步简化了并发编程和函数式编程的实现。Java 9及以后的版本继续在模块化、性能和安全性方面进行改进,确保Java语言能够适应不断变化的技术需求和市场趋势。 MySQL是一个关系型数据库管理系统(RDBMS),它基于结构化查询语言(SQL)来管理和存储数据。MySQL由瑞典MySQL AB公司开发,并于2008年被Sun Microsystems收购,随后在2010年,Oracle公司收购了Sun Microsystems,从而获得了MySQL的所有权。MySQL以其高性能、可靠性和易用性而闻名,它提供了多种特性来满足不同规模应用程序的需求。作为一个开源解决方案,MySQL拥有一个活跃的社区,不断为其发展和改进做出贡献。它的多线程功能允许同时处理多个查询,而其优化器则可以高效地执行复杂的查询操作。 随着互联网和Web应用的快速发展,MySQL已成为许多开发者和公司的首选数据库之一。它的可扩展性和灵活性使其能够处理从小规模应用到大规模企业级应用的各种需求。通过各种存储引擎,MySQL能够适应不同的数据存储和检索需求,从而为用户提供了高度的定制性和性能优化的可能性。

    jQuery实现左右切换全屏轮播图特效源码.zip

    这是一种全屏轮播风格的特效,使用HTML、CSS和Javript编写。轮播图包含多张图片和对应的文本介绍,通过自动滑动和手动切换两种方式,展示出不同的内容。该轮播图在网页头部或者特定板块上使用,能够为用户提供直观的视觉体验和丰富的内容呈现。而且,该轮播图可以灵活地设置大小、位置、动画等属性,便于根据实际需求进行个性化定制。

    精选毕设项目-图片预览带后端.zip

    精选毕设项目-图片预览带后端

    精选毕设项目-番茄时钟.zip

    精选毕设项目-番茄时钟

    精选毕设项目-简单的商城小应用.zip

    精选毕设项目-简单的商城小应用

    精选毕设项目-仿zcool站酷.zip

    精选毕设项目-仿zcool站酷

    精选毕设项目-录音机.zip

    精选毕设项目-录音机

    南京理工大学毕业论文overleaf LaTex模板,微调版

    南京理工大学毕业论文overleaf LaTex模板,按照我个人的写作需求修改后的版本

Global site tag (gtag.js) - Google Analytics