题目

题目背景

有一个著名的题目:

  1. 五个海盗抢到了100个金币,每一颗都一样的大小和价值连城。
  2. 他们决定这么分:
  3. 1.抽签决定自己的号码 ------ [12345]
  4. 2.首先,由1号提出分配方案,然后大家5人进行表决,当且仅当不少于半数的人同意时,按照他的提案进行分配,否则将被扔入大海喂鲨鱼。
  5. 3.如果1号死后,再由2号提出分配方案,然后大家4人进行表决,当且仅当不少于半数的人同意时,按照他的提案进行分配,否则将被扔入大海喂鲨鱼。
  6. 4.以次类推
  7. 每个海盗都是很聪明的人,他们遵循如下原则:
  8. 1.保命;
  9. 2.如果满足条件1,那么想办法获得更多的钱;
  10. 3.如果满足条件12,那么想办法杀更多的人。
  11. 那么最终的分配方案会是怎样的呢?

答案当然就是98,0,1,0,1。(注意这里是:不少于半数

小奔合上书,来到了船头,突然发现真的有一群海盗!

小奔就这样被抓住了。。。

题目描述

NNN个海盗把他绑架到了海盗船上,开始准备瓜分他MMM个金币。

海盗们让小奔求出:若是NNN个海盗抢到了MMM个金币,并且要不少于QQQ%的人投赞成票,他们会如何分配呢?

请你给出NNN个海盗分MMM个金币且要不少于QQQ%的人投赞成票的解法,并保证结果号码较小的分到的金币尽可能的多。

每个数字间用一个空格隔开,如果结果中某个海盗死了,输出 −1-1−1 代替。

分析

本题可以参考海盗分金模型,倒着考虑,维护当前每个人分得的金币。可以发现第i个人自己得到的金币一定是i+1个人的金币数-1(有些数据不一定),分配的方法跟海盗分金一样,选出后面人数*q的人(要排序选择最好讨好的人)就可以了(同时维护号码较小的人所得金币越多)

代码

c++:

  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. int a[1001],b[1001],d[1001],f[1001];
  5. int k,n,m,o;
  6. void zx(int p,int q)a
  7. {
  8. int i,j;
  9. i=0;
  10. while(((1.0*i)/(1.0*(q-p+1)))<(1.0*o/100))
  11. {
  12. ++i;
  13. k=k+b[p+i-1]+1;
  14. if(i==1) --k;
  15. a[d[p+i-1]]=b[p+i-1]+1;
  16. if(a[d[p+i-1]]>m) a[d[p+i-1]]=m;
  17. }
  18. if(p+i-1==q) return;
  19. for(j=p+i;j<=q;++j) a[d[j]]=0;
  20. }
  21. void qsort(int l,int r)
  22. {
  23. int i,j,mid,p,m1;
  24. i=l; j=r;
  25. mid=b[(l+r)/2];
  26. m1=d[(l+r)/2];
  27. do
  28. {
  29. while(b[i]<mid||(b[i]==mid&&d[i]<m1)) ++i;
  30. while(b[j]>mid||(b[j]==mid&&d[j]>m1)) --j;
  31. if(i<=j)
  32. {
  33. p=b[i]; b[i]=b[j]; b[j]=p;
  34. p=d[i]; d[i]=d[j]; d[j]=p;
  35. ++i; --j;
  36. }
  37. }while(!(i>j));
  38. if(l<j) qsort(l,j);
  39. if(i<r) qsort(i,r);
  40. }
  41. int main()
  42. {
  43. int i,j,c[1001];
  44. scanf("%d%d%d",&n,&m,&o);
  45. for(i=n;i>=1;--i)
  46. {
  47. c[i]=i;
  48. memcpy(b,a,sizeof(b));
  49. if(i!=n) for(j=n;j>=i+1;--j) f[j]=a[j];
  50. memcpy(d,c,sizeof(d));
  51. k=0;
  52. if(i!=n) qsort(i+1,n);
  53. memset(a,0,sizeof(a));
  54. if(i!=n) zx(i,n);
  55. a[i]=m-k;
  56. if(a[i]<0)
  57. {
  58. for(j=n;j>=i+1;--j) a[j]=f[j];
  59. a[i]=-1;
  60. }
  61. }
  62. for(i=1;i<=n;++i) printf("%d ",a[i]);
  63. return 0;
  64. }

Pascal:

  1. var
  2. a,b,c,d,f:array[1..1000]of longint;
  3. i,j,k,n,m,o:longint;
  4. procedure zx(p,q:longint);
  5. var
  6. i,j:longint;
  7. begin
  8. i:=0;
  9. while (i/(q-p+1))<(o/100) do
  10. begin
  11. inc(i);
  12. k:=k+b[p+i-1]+1;
  13. if i=1 then dec(k);
  14. a[d[p+i-1]]:=b[p+i-1]+1;
  15. if a[d[p+i-1]]>m then a[d[p+i-1]]:=m;
  16. end;
  17. if (p+i-1)=q then exit;
  18. for j:=p+i to q do a[d[j]]:=0;
  19. end;
  20. procedure qsort(l,r:longint);
  21. var
  22. i,j,mid,p,m1:longint;
  23. begin
  24. i:=l;j:=r;
  25. mid:=b[(l+r) div 2];
  26. m1:=d[(l+r) div 2];
  27. repeat
  28. while (b[i]<mid)or((b[i]=mid)and(d[i]<m1)) do inc(i);
  29. while (b[j]>mid)or((b[j]=mid)and(d[j]>m1)) do dec(j);
  30. if (i<=j) then
  31. begin
  32. p:=b[i]; b[i]:=b[j]; b[j]:=p;
  33. p:=d[i]; d[i]:=d[j]; d[j]:=p;
  34. inc(i);
  35. dec(j);
  36. end;
  37. until i>j;
  38. if l<j then qsort(l,j);
  39. if i<r then qsort(i,r);
  40. end;
  41. begin
  42. readln(n,m,o);
  43. for i:=n downto 1 do
  44. begin
  45. c[i]:=i;
  46. b:=a;
  47. if i<>n then for j:=n downto i+1 do f[j]:=a[j];
  48. d:=c;
  49. k:=0;
  50. if i<>n then qsort(i+1,n);
  51. fillchar(a,sizeof(a),0);
  52. if i<>n then zx(i,n);
  53. a[i]:=m-k;
  54. if a[i]<0 then
  55. begin
  56. for j:=n downto i+1 do a[j]:=f[j];
  57. a[i]:=-1;
  58. end;
  59. end;
  60. for i:=1 to n do write(a[i],' ');
  61. end.

比赛:小奔的方案 solution的更多相关文章

  1. 比赛:大奔的方案solution

    分析: 此题是小奔的方案的改进.小奔的方案思路:倒推,每次都从小到大排序并且保证小号在前,然后使每一个人分到的金币都是上一次加一,直到金币分完或者自己可以存活(投票率大于等于所需概率),如果不行就-1 ...

  2. 比赛:小奔与不等四边形solution

    题目: 题目背景 有这样一道经典的数学题:已知一个四边形的边长是四个连续的正整数,求证这个四边形的面积的最大值不为整数.小奔轻松地证明了这个问题,现在问题来了,大奔要求小奔以最快的速度算出给定边长的四 ...

  3. 比赛:小奔的矩形solution

    分析: 交叉相乘,然后除以最大公因数(为了减少爆常数的可能性std做了两次,数据很大),得到的两个数相加减二就是答案 代码: var p,q,n,m,a,b,i:int64; begin readln ...

  4. Hadoop小文件存储方案

    原文地址:https://www.cnblogs.com/ballwql/p/8944025.html HDFS总体架构 在介绍文件存储方案之前,我觉得有必要先介绍下关于HDFS存储架构方面的一些知识 ...

  5. 微信小程序登录方案

    微信小程序登录方案 登录程序 app.js 调用wx.login获取code 将code作为参数请求自己业务登录接口获取session_key 存储session_key 如果有回调执行回调 App( ...

  6. P4906 小奔关闹钟

    题目背景 由于今天是星期一,闹钟准时响了,由于小奔太困了,所以她想关停闹钟. 题目描述 可是,他的闹钟电路太复杂了,有很多个开关,每个开关都连着其他开关,其他开关又连着更多的开关,当且仅当所有开关都关 ...

  7. Dfs【p4906】小奔关闹钟

    Background 由于今天是星期一,闹钟准时响了,由于小奔太困了,所以她想关停闹钟. Description 可是,他的闹钟电路太复杂了,有很多个开关,每个开关都连着其他开关,其他开关又连着更多的 ...

  8. MR案例:小文件处理方案

    HDFS被设计来存储大文件,而有时候会有大量的小文件生成,造成NameNode资源的浪费,同时也影响MapReduce的处理效率.有哪些方案可以合并这些小文件,或者提高处理小文件的效率呢? 1). 所 ...

  9. selenium自动追踪微信小程序审核方案

    小程序随着腾讯的不断推广,变的越来越普及,同时更新迭代的速度也越来越快,种类越来越多,那么在如何保证时效性就显得尤为重要,其中很重要一个环节就在于小程序审核通过之后,能否立刻通知到相关技术人员进行发布 ...

随机推荐

  1. QT父子窗口事件传递与事件过滤器(讲了一些原理,比较清楚)

    处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...

  2. ring3层一种占用文件的方法(DuplicateHandle以后,把占用文件的句柄丢给系统进程,导致被占用)

    前段时间,一个测试工程师问我关于怎样长时间的占用一个文件,而使别的程序无法再访问这个文件,想起以前很多病毒木马经常劫持hosts文件不放,除非你找到占用文件的程序,并强行结束掉,否则怎么也访问不了ho ...

  3. <房间内功能>打赏小动画

    截图如下 :        功能:   每次点击礼物,都要通过动画显示一个小图标,最多显示两行图标栏,送多次会显示然后再次显示,显示 XX 送给 XX 一个小礼物的动画样式.动画样式效果为,整体动画模 ...

  4. Google+团队如何测试移动应用 - from Google Testing Blog

    How the Google+ Team Tests Mobile Apps by Eduardo Bravo Ortiz “移动第一”在当下已成为很多公司的口头禅.但是能够用一种合理的方法来测试移动 ...

  5. 【入门】WebRTC知识点概览 | 内有技术干货免费下载

    什么是WebRTC WebRTC 即Web Real-Time Communication(网页实时通信)的缩写,是一个支持网页浏览器之间进行实时数据传输(包括音频.视频.数据流)的技术.经过多年的发 ...

  6. PowerDesigner16.5 有用地址

    http://blog.csdn.net/keenweiwei/article/details/32720427

  7. JAVA复习笔记02

    16.interface中的成员变量默认为public static final类型,方法只能是public(默认为public) 17.内部类访问外部类成员: Outer.this.num; 18. ...

  8. Codeforces Round #563 (Div. 2)C

    C. Ehab and a Special Coloring Problem 题目链接:http://codeforces.com/contest/1174/problem/C 题目 You're g ...

  9. bugku welcome to bugkuctf

    题目地址:http://123.206.87.240:8006/test1/ 这道题主要用到了俩个知识点:php伪协议和序列化 点进题目看到:you are not the number of bug ...

  10. IO解惑:cephfs、libaio与io瓶颈

    最近笔者在对kernel cephfs客户端进行fio direct随机大io读测试时发现,在numjobs不变的情况下,使用libaio作为ioengine,无论怎么调节iodepth,测试结果都变 ...