`
kmplayer
  • 浏览: 498271 次
  • 性别: 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 矛盾。因此,所有有可能成为代表的人都已经留在表里了。

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

相关推荐

    node-v6.11.1-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2024-2030中国风机盘管组市场现状研究分析与发展前景预测报告.docx

    2024-2030中国风机盘管组市场现状研究分析与发展前景预测报告

    node-v4.8.6-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    dust_sensor_code_x2.zip

    dust_sensor_code_x2.zip

    人力资源管理习题答案及题库

    人力资源管理习题答案及题库

    基于微信小程序的智慧超市购物车系统设计与开发教程论文题目.docx

    基于微信小程序的智慧超市购物车系统设计与开发教程论文题目.docx

    node-v6.14.0-linux-armv6l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    53-53.渗透测试-CSRF案例分析.mp4

    53-53.渗透测试-CSRF案例分析.mp4

    Tetris base on Android(基于Android的俄罗斯方块).zip

    Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

    Java毕业设计-基于SSM框架的《数据库系统原理》课程平台(源码+演示视频+说明).rar

    Java毕业设计-基于SSM框架的《数据库系统原理》课程平台(源码+演示视频+说明).rar 【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:562】 https://pan.quark.cn/s/b3a97032fae7 【实现功能】 管理员在后台可以全面管理系统,管理员的功能主要包括用户管理、新闻管理、书籍管理和评论管理等。 用户在没有注册之前,进入网站,用户的主要功能包括查看网站首页、公告信息、书籍分类和书籍信息,用户在注册登录后进入网站,用户的主要功能包括书籍评论、加入书架、书籍下载、个人信息管理、我的书架和我的留言。

    使用 python 的异步库 playwright 进行爬取豆瓣电影排行榜的数据

    免费,开源项目! spiderDouban.py 文件是一个Python程序,主要目的是利用异步库 playwright 进行爬取豆瓣电影排行榜的数据。该程序包含两个类:FunChart 和 PlaywrightChart。主要功能如下: FunChart 类:定义了一些基础配置,如网页URL、是否使用headless模式、并发控制、登录设置等。它还包含了数据保存、随机等待和检查已爬取链接的方法。 PlaywrightChart 类继承自 FunChart,专注于实际的排行榜爬取: open_browser() 方法启动一个持久会话的Chromium浏览器,根据配置加载页面并检查是否需要爬取新的数据。 get_page() 用于获取页面,并处理可能的登录和请求拦截。 open_page() 方法负责爬取页面中的链接列表,然后在并发控制下逐个爬取数据,并在遇到错误时记录日志。 spiderAll() 方法是对单个链接的详细爬取,包括滑动加载更多数据。 程序的入口点在 if __name__ == "__main__": 中,这里实例化 PlaywrightChart 类并开始爬取。

    node-v6.0.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v4.8.3-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v4.3.1-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2024-2030中国二甲基三硫醚市场现状研究分析与发展前景预测报告.docx

    2024-2030中国二甲基三硫醚市场现状研究分析与发展前景预测报告

    40-40.XSS跨站脚本攻击植入方式.mp4

    40-40.XSS跨站脚本攻击植入方式.mp4

    example1c.c

    example1c.c

    数字化转型中的大数据治理架构qy.pptx

    数字化转型中的大数据治理架构qy.pptx

    2024-2030中国独立式美容激光器市场现状研究分析与发展前景预测报告.docx

    2024-2030中国独立式美容激光器市场现状研究分析与发展前景预测报告

    Adafruit-MPU6050.rar

    mpu6050

Global site tag (gtag.js) - Google Analytics