题目大意:

n 个人 在选取班长 1号十分想当班长,他已经知道其他人选择了谁,但他可以贿赂其他人改选他,问贿赂的最小值

ps.他自己也要投一个人

要处理一个问题是,他自己投谁

其实这个问题在这种局面下在不同算法有不同处理方法,先不要考虑

一开始我想的是纯贪心:

选2个最小的比较票数最多中最小的  谁小选哪个

直到1号票数最多(但不是唯一)

这个时候再考虑 他投给谁

1.如果有一个人票数跟他一样多x ,这个时候1号还要拿一票,谁给他一票他就投给谁,不影响结果(给他同样票数的人,那个人票数不变,1号多了1票,所以也不变)

2.如果其他人票数都只比他少1  ,这个时候1号不需要拿票了,但他也必须投给一个人,会使得有人跟他一样,所以又要去拿一张最小的

3.其他情况投给票数比他少2的即可

但这样有反例

1

10

9  4 8 9  8 1 4  9  2

14 4 7 16 9 3 19 17 16

正解是 14+4;

而我的算法 先选了4+7,最后选了9 答案是20;

正确解法,枚举加贪心:

既然n<100 我应该就需要考虑到枚举or搜索的可能性,教训要牢记

枚举1获胜所得的票数p,在循环找所有大票大于p-1的人,从小到大给1,结束后超过p 表示不行

否则:在从小到大找几个填到p 更新ANS

对于1投给谁 ,只有这种情况有意义 1有p票 其他人p-1票

总票数 n*p-n+1+1(1的一票);

如果 p=1; 总票数 2 代表只有2个人 但是n>=3

如果 p=2; 总票数为n+2,超过了应该的总票数n

如果 p>2  于p=2同理 所以不需要考虑

代码如下:

  1. //已知算法下
  2. /*
  3. 1WA 原因 算法实现设计错误,最后一部,取k个最小的东西,可是因为按照优先序号排序的,所以算法与设计冲突
  4.  
  5. 差错数据
  6. 6
  7. 1 2 2 3 3
  8. 7 8 9 1 1
  9. 正确: 2
  10. 错误 17
  11. */
  12. #include <cstdio>
  13. #include <cstdlib>
  14. #include <cmath>
  15. #include <cstring>
  16. #include <ctime>
  17. #include <algorithm>
  18. #include <iostream>
  19. #include <sstream>
  20. #include <string>
  21. #define oo 0x13131313
  22. using namespace std;
  23. void init()
  24. {
  25. freopen("a.in","r",stdin);
  26. freopen("a.out","w",stdout);
  27. }
  28. const int maxn=100+5;
  29. struct node
  30. {
  31. int p,w;
  32. int ok;
  33. };
  34. node A[maxn];
  35. int piao[maxn];
  36. int P[maxn];
  37. void copy()
  38. {
  39. for(int i=0;i<maxn;i++)
  40. A[i].ok=1;
  41. for(int i=0;i<maxn;i++)
  42. P[i]=piao[i];
  43. }
  44. int n;
  45. void input()
  46. {
  47. cin>>n;
  48. memset(piao,0,sizeof(piao));
  49. for(int i = 1; i <= n - 1; i++)
  50. {
  51. scanf("%d",&A[i].p);
  52. piao[A[i].p]++;
  53. }
  54. for(int i = 1;i <= n - 1; i++)
  55. scanf("%d",&A[i].w);
  56. }
  57. bool cmp(node a,node b)
  58. {
  59. if(a.p==b.p) return a.w<b.w;
  60. else return a.p<b.p;
  61. }
  62. bool cmp2(node a,node b)
  63. {
  64. return a.w<b.w;
  65. }
  66. void solve()
  67. {
  68. int ans=100000000,tans=0;
  69.  
  70. for(int i=piao[1];i<=n-1;i++)
  71. {
  72. sort(A+1,A+n,cmp);
  73. copy();tans=0;
  74. for(int j=1;j<=n-1;j++)
  75. {
  76. if(A[j].p!=1)
  77. {
  78. if(P[A[j].p]>i-1)
  79. {
  80. A[j].ok=0;
  81. tans+=A[j].w;
  82. P[A[j].p]--;
  83. P[1]++;
  84. }
  85. }
  86. }
  87. if(P[1]>i) continue;
  88. else
  89. {
  90. sort(A+1,A+n,cmp2);
  91. int tot=0;
  92. for(int j=1;j<=n-1;j++)
  93. if(tot<i-P[1])
  94. if(A[j].p!=1)
  95. {
  96. if(A[j].ok==1)
  97. {
  98. tans+=A[j].w;
  99. tot++;
  100. }
  101. }
  102. }
  103. if(tans<ans) ans=tans;
  104. }
  105. printf("%d\n",ans);
  106. }
  107. int main()
  108. {
  109. // init();
  110. int T;
  111. cin>>T;
  112. while(T--)
  113. {
  114. input();
  115. solve();
  116. }
  117. }

【枚举+贪心】【ZOJ3715】【Kindergarten Electiond】的更多相关文章

  1. D. Diverse Garland Codeforces Round #535 (Div. 3) 暴力枚举+贪心

    D. Diverse Garland time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  2. 51nod1625(枚举&贪心)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1625 题意:中文题诶- 思路:枚举+贪心 一开始写的行和列同时 ...

  3. 枚举+贪心 HDOJ 4932 Miaomiao's Geometry

    题目传送门 /* 题意:有n个点,用相同的线段去覆盖,当点在线段的端点才行,还有线段之间不相交 枚举+贪心:有坑点是两个点在同时一条线段的两个端点上,枚举两点之间的距离或者距离一半,尽量往左边放,否则 ...

  4. [BZOJ 1028] [JSOI2007] 麻将 【枚举+贪心判断】

    题目链接:BZOJ - 1028 题目分析 枚举听的是哪种牌,再枚举成对的是哪种牌,再贪心判断: 从1到n枚举每一种牌,如果这种牌的个数小于0,就返回不合法. 将这种牌的张数 % 3, 剩下的只能和 ...

  5. 【枚举+贪心】【TOJ3981】【ICPC Balloons】

    给你N种不同颜色气球,每种气球有个数目 count[i],给的同种颜色气球可能是L尺寸,或M尺寸. M个问题,每个问题有个解决人数ac[i]. 每个问题 要分配一种颜色的气球,尺寸要一样 现在 这些气 ...

  6. FZU 2252 Yu-Gi-Oh!(枚举+贪心)

    Problem 2252 Yu-Gi-Oh! Accept: 105    Submit: 628 Time Limit: 1000 mSec    Memory Limit : 32768 KB   ...

  7. UVALive 6912 Prime Switch 暴力枚举+贪心

    题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  8. bzoj1050[HAOI2006]旅行comf(枚举+贪心+并查集)

    Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...

  9. AtCoder - 2565 枚举+贪心

    There is a bar of chocolate with a height of H blocks and a width of W blocks. Snuke is dividing thi ...

随机推荐

  1. 那么温暖http合约,入门。

    简介 年提出.经过几年的使用与发展,得到不断地完好和扩展.眼下在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,并且HTTP-NG(Next Generation ...

  2. Java IO 和 NIO

    昨天面试问到了有关Java NIO的问题,没有答上来.于是,在网上看到了一篇很有用的系列文章讲Java IO的,浅显易懂.后面的备注里有该系列文章的链接.内容不算很长,需要两个小时肯定看完了,将该系列 ...

  3. Java API设计CheckList

    API设计原则:正确.好名.易用.易学.够快.够小.但我们从来不缺原则,〜〜〜 Interface 1.The Importance of Being Use Case Oriented,一个接口应当 ...

  4. hasClass方法 动画方法说明

    $(this).hasClass("selected");判断是否含有selected样式

  5. Android TextView 字符串展示不同大小文字

    用Spannable字符串实现: String s= "Hello Everyone"; SpannableString ss1= new SpannableString(s); ...

  6. 浅谈UE4引擎

    首先要说的是,游戏开发是一项高度复杂的代码开发工作,编程语言只是最基本的知识,它涉及的内容还有计算机图形学.3D数学.物理学等复杂的学科.但是若需要学完这么多知识才能开发游戏,恐怕许多人都已经断气了, ...

  7. Update与Mysql、Sqlsever中的随机数

    批量修改数据库中的字段为随机数时 Mysql中的写法: )--取1-50的随机数 Sqlsever中的写法: update t set col=ABS(CHECKSUM(NEWID()))%50+1 ...

  8. Python之路第六天,基础(7)-正则表达式(re)

    Python RE模块(正则表达式) 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成 ...

  9. FFMPEG图片转视频

    1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流 ffmpeg -i input_file -acod ...

  10. C语言基础05

    二维数组的定义: 数据类型 数组名称 [ 常量表达式1 ] [ 常量表达式2 ] = {.....} int a[ 2 ][ 3 ] ={ {4,5,6}, {7,8,0},   //或者{7} 后面 ...