问题描述

n个选民给m个候选者投票,每个人只能投一票,最终票数超过全部其它人的人当选(并列第一不算当选)。每个人都喜欢吃糖,通过给某个人一定数量的糖,就可以让他投谁他就他谁。第一行输入两个整数选民数n和候选人数m,这两个数字都是[1,3000]区间内的整数。接下来n行每行两个数,第i行表示第i个人投谁、改变主意需要的糖果数。
问:最少花费多少个糖果才能使得1号候选人当选。

思路

贪心,优先贿赂哪些“胃口”小的选民。但是这样会有一个问题。
如:候选人1现有2票,候选人2现有3票,这时选民1要想超过候选人2有两种措施:贿赂投其它候选人的选民;贿赂候选人2的选民。这两种措施产生的效果是不一样的,选择措施1只会让候选人1跟候选人2平手,而措施2却能够一举翻盘。也就是说,此时,“邻之厚君之薄也”,敌人变弱等于我变强,候选人2的选民“一票顶2票”。就算候选人2的选民比较“贵”,但需要贿赂的人数少了,那也可能更加划算。

关键在于知道何时贿赂“便宜”的选民,何时贿赂“贵”的选民。
直接假设候选人1最终得票数为x,那么现在票数不小于x的候选人我要削弱它们,直到削弱到x-1为止。削弱“强候选人”之后,我的票数如果还是不够,我就可以去“便宜候选人”里面尽情“贪心”了。
那么如何假定最终票数呢?直接枚举最终票数的全部可能值。
最终票数的值必然不大于n/2+1。因为一山不容二虎。
最终票数的值必然大于最开始的票数,因为不可能越贿赂越少。
如果票数的值与贿赂糖果数之间满足凸性函数关系,那么三分法可以派上用场。但是不一定适用。

整体复杂度为O(n^2)

import java.util.*;public class Main {
class Person {int who;long candy;int id;Person(int who, long candy, int id) {this.who = who;this.candy = candy;this.id = id;}
}class Candidate {LinkedList<Person> sons = new LinkedList<>();
}long howmany(List<Candidate> candidates, Person[] people, int need, int one) {int s = 0;boolean used[] = new boolean[people.length];for (int i = 0; i < candidates.size() && candidates.get(i).sons.size() >= need; i++) {Iterator<Person> it = candidates.get(i).sons.iterator();int buy = 0;while (candidates.get(i).sons.size() - buy >= need) {if (!it.hasNext()) return Long.MAX_VALUE;Person p = it.next();s += p.candy;buy++;one++;used[p.id] = true;}}//没够,需要凑for (Person p : people) {if (one >= need) break;if (!used[p.id] && p.who != 1) {one++;s += p.candy;}}return s;
}Main() {Scanner cin = new Scanner(System.in);int n = cin.nextInt();int m = cin.nextInt();Person[] a = new Person[n];for (int i = 0; i < n; i++) {a[i] = new Person(cin.nextInt(), cin.nextInt(), i);}Arrays.sort(a, Comparator.comparing(x -> x.candy));List<Candidate> piao = new ArrayList<>(m + 1);for (int i = 0; i <= m; i++) {piao.add(new Candidate());}for (Person p : a) {piao.get(p.who).sons.add(p);}int one = piao.get(1).sons.size();List<Candidate> other = piao.subList(1, piao.size());other.sort(Comparator.comparing(x -> -x.sons.size()));long s = Long.MAX_VALUE;for (int i = one; i <= n / 2 + 1; i++) {long use = howmany(other, a, i, one);s = Math.min(s, use);}System.out.println(s);
}public static void main(String[] args) {new Main();
}
}

转载于:https://www.cnblogs.com/weiyinfu/p/9609810.html

一道笔试题:贿赂选民相关推荐

  1. 给定一个数值,输出符合中国人习惯的读法--记一道笔试题

    题目:给定一个数字,最大小于一万亿,输出符合中国人习惯的读法,例如: a.12输出:十二 b.102输出:一百零二 c.1002输出:一千零二 d.112输出:一百十二 e.10112输出:一万零一百 ...

  2. 一道笔试题--求二进制数1的个数

    要进一家新公司难免要进行笔试,虽然笔试通过的人很多都有背题之嫌,但是统计意义上最起码可以看出一个程序员的认真程度,毕竟很多公司的考题也不是自己创的,也是在网上偷的,允许公司偷题就必须允许应聘者偷答案. ...

  3. C#在类型实例化时都干了什么:从一道笔试题说开去

    C#在类型实例化时都干了什么:从一道笔试题说开去 原文来自:http://www.cnblogs.com/instance/archive/2011/05/27/2059409.html 前一阵子我参 ...

  4. 从一道笔试题谈算法优化(下)

    因为受到经济危机的影响,我在 bokee.com 的博客可能随时出现无法访问的情况:因此将2005年到2006年间在 bokee.com 撰写的博客文章全部迁移到 csdn 博客中来,本文正是其中一篇 ...

  5. 从一道笔试题谈算法优化(上)

    因为受到经济危机的影响,我在 bokee.com 的博客可能随时出现无法访问的情况:因此将2005年到2006年间在 bokee.com 撰写的博客文章全部迁移到 csdn 博客中来,本文正是其中一篇 ...

  6. 去年,蚂蚁一面的一道笔试题,中等难度

    你好,我是 yes. 最近不是跳槽季嘛,今儿我就来分享一道我之前遇到的笔试题(上机写代码,这里统称笔试),这道题遇到的几率还是比较高的. 很多人可能准备去一波阿里或者其他大厂,而这些大厂面试过程一般都 ...

  7. 90%的人都不会做的一道笔试题

    关注"Java后端技术全栈" 回复"面试"获取全套大厂面试资料 数组操作的题目,有的确实比较容易,但并非每个问题都是如此.今天就来看道90%的人都不会做的笔试题 ...

  8. 一道笔试题引发的Promise笔记

    前言 近来参加校招笔试,发现有好几道关于Promise的题目.然而我都没有了解过.所以,这篇文章以网易笔试的一道题开始,记录关于Promise的那些事. 文章地址:http://lsxj615.com ...

  9. zz从一道笔试题谈算法优化(上)

    作者:赖勇浩(http://blog.csdn.net/lanphaday) 引子 每年十一月各大IT公司 都不约而同.争后恐后地到各大高校进行全国巡回招聘.与此同时,网上也开始出现大量笔试面试题:网 ...

最新文章

  1. 好消息:Sci-Hub解封了!可以看2021新文献了!附可用网址
  2. C 内存free()出错
  3. SpringBoot+Swagger2实现可视化API文档流程
  4. Android学习笔记:对Android应用进行单元测试
  5. 枚举集合的EnumSet
  6. Altium 原理图出现元件“Extra Pin…in Normal of part ”警告的解决方法
  7. python井字棋如何判断输赢_井字棋判断输赢的两种方法
  8. Firefox 3中的快捷键!
  9. 经典查找算法 --- R树
  10. ActiveMQ学习笔记(4)----JMS的API结构和开发步骤
  11. 思科模拟器启用CHAP协议
  12. Jetpack Compose SideEffect:副作用及相关API
  13. Already included file name
  14. 工业大数据分析建模和算法
  15. 互联网时代,传统企业如何做引流拓客?
  16. idea复制项目导致sources root复用了另一个项目
  17. @Validated使用
  18. CAD梦想画图中的“绘图工具——点”
  19. 【软件构造】实验一的心得体会
  20. 【C++】C++数组初始化方法

热门文章

  1. easyui上传文件 jsp+js+controller
  2. asp.net处理get,post数据
  3. P2639 [USACO09OCT]Bessie的体重问题 【背包问题】
  4. 杨潮观《偷桃捉住东方朔》
  5. 关系型数据库知识小结
  6. 开源项目:底部动作条(BottomSheet)
  7. 设置ecshop2.7首页幻灯片宽度为100%
  8. CTA策略05_AtrRsiStrategy
  9. 读书笔记_量化交易如何建立自己的算法交易02
  10. c语言 乘号 指针 避免,C语言指针篇(一)指针与指针变量