进阶实验2-3.1 海盗分赃 (25分)

P 个海盗偷了 D 颗钻石后来到公海分赃,一致同意如下分赃策略:

首先,P 个海盗通过抽签决定 1 - P 的序号。然后由第 1 号海盗提出一个分配方案(方案应给出每个海盗分得的具体数量),如果能够得到包括 1 号在内的绝对多数(即大于半数)同意,则按照该分配方案执行,否则 1 号将被投入大海喂鲨鱼;而后依次类似地由第 2 号、第 3 号等等海盗提出方案,直到能够获得绝对多数同意的方案出现为止,或者只剩下最后一位海盗,其独占所有钻石。请编写一个程序,给出第 1 号海盗的钻石分配方案中自己分得的钻石数量。

附带的三个假定:

  • “聪明”与“贪婪”假定:每个海盗总能够以本人利益最大化作为行为准则;
  • “人性化”假定:在能够取得尽量多钻石的情况下,海盗不会故意致同伙于死地;
  • “无偏见”假定:海盗之间没有个人恩怨,分给其他海盗钻石的次序以小序号优先为原则。

输入格式:

输入在一行中给出 2 个正整数 D 和 P(3≤P≤D≤100)。

输出格式:

输出第 1 号海盗的钻石分配方案中自己分得的钻石数量。

输入样例:

10 7

输出样例:

6

容易猜到是个博弈题,但是博弈很弱,好在这道题给了三个假定,每个海盗会以本人利益最大化为行为准则,所以投其所好是关键,只要给他尽量多,他就会支持你,不会治你于死地。每个人的方案都建立在后一个人的方案基础之上,拿题目样例来说,如果只剩了7号一个人必然最佳方案是他获得全部10个钻石,如果剩下6和7,也是7号得到全部的,6号得0个,7号不满意6号就要挂掉,如果是5号的方案,为了获得最大利益,同时要保证自己不死,他需要给6号一丁丁好处,即给他一颗,他肯定会支持5号,总比一颗得不到的好,同样的,4号需要在5号的基础上拉拢一些人给这些人多一颗的量,让他们支持自己,这里用优先队列解决。代码:
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
int d,p;
int v[101];
struct cmp {
    bool operator()(const int &a,const int &b) const {
        return v[a] > v[b];
    }
};
int main() {
    scanf("%d%d",&d,&p);
    priority_queue<int,vector<int>,cmp> q;
    v[p] = d;
    q.push(p);
    q.push(p - 1);
    int no = p - 2;
    while(no > 0) {
        int num = 1,c = d;
        while(num * 2 <= p - no + 1) {
            c -= ++ v[q.top()];
            q.pop();
            num ++;
        }
        while(!q.empty()) {
            v[q.top()] = 0;
            q.pop();
        }
        v[no] = c;
        for(int i = no --;i <= p;i ++) {
            q.push(i);
        }
    }
    printf("%d",v[1]);
}

原文地址:https://www.cnblogs.com/8023spz/p/12307645.html

时间: 2024-10-10 12:43:02

进阶实验2-3.1 海盗分赃 (25分)的相关文章

基础实验7-2.4 PAT排名汇总 (25分)

计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn). 每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩.考试结束后,各个考点的成绩将即刻汇总成一张总的排名表. 现在就请你写一个程序自动归并各个考点的成绩并生成总排名表. 输入格式: 输入的第一行给出一个

进阶实验6-3.6 最小生成树的唯一性 (35分)

给定一个带权无向图,如果是连通图,则至少存在一棵最小生成树,有时最小生成树并不唯一.本题就要求你计算最小生成树的总权重,并且判断其是否唯一. 输入格式: 首先第一行给出两个整数:无向图中顶点数 N(≤)和边数 M.随后 M 行,每行给出一条边的两个端点和权重,格式为“顶点1 顶点2 权重”,其中顶点从 1 到N 编号,权重为正整数.题目保证最小生成树的总权重不会超过 2?30??. 输出格式: 如果存在最小生成树,首先在第一行输出其总权重,第二行输出“Yes”,如果此树唯一,否则输出“No”.如

基础实验5-2.2 电话聊天狂人 (25分)-散列表

解题思路: 用散列表(链表结构) 1.计算散列表长度(取比输入数据大一点的素数p) 2.构造散列函数 3.读入数据,求出散列位置插入 4.一边遍历散列表,一边求出现最多的电话狂人 #include <stdio.h> #include <malloc.h> #include <string.h> #include <math.h> #define KeyLength 11 #define ElemType char typedef enum {false,t

基础实验4-2.1 树的同构 (25分)--二叉树

解题思路: 1.建二叉树(静态链表) 不作为任何结点的孩子结点的即为根结点 2.判断是否同构 1)空树,同构 2)两棵树中若只有其中一棵是空树,则不同构 3)两棵树的根结点值不等,不同构 4)若左子树均空,则递归判断右子树 5)若左子树均不空, 比较左子树的根结点值 相等:则没有交换左右子树,判断树1左子树和树2左子树.树1右子树和树2右子树 不等:交换左右子树,判断树1左子树和树2右子树,树1右子树和树2左子树 #include <stdio.h> #include <string.h

(算法)海盗分赃_2

分享一篇趣文(来自伯乐在线:http://blog.jobbole.com/70395/),同样是海盗分赃问题,这篇文章以诙谐幽默的口吻以及浅显易懂的对话来解释海盗分赃问题. 与上一篇博文海盗分赃_1不同的是,这里的投票规则为半数即可,并不要求大于半数.因此该问题的思路过程结果为: (300,0) (299,0,1) (299,0,1,0) (298,0,1,0,1) (298,0,1,0,1,0) 文章如下: #算法题# 6个海盗要分赃300金币.规则是由资格最老的海盗提出各人分到的数量,然后

【博弈】海盗分赃

题目大意:有N(N<=1000)个贪婪的海盗,他们得到了100,000个金币,决定分赃.他们都很精明,都想自己利益最大化,并采取如下策略: 1. 首先N人排好次序. 2. 由编号最大者给出分赃方案. 3. 所有人表决,50%及以上的人赞成就分赃成功,否则转4. 4. 杀掉提案者(总人数少了1),转2. 你的任务:判断第几号海盗得最多金币,有多少个. 题解:此题需要绕一个小弯,首先,获得钱最多的一定是第一个人.其次,他只需给所有奇数号的人一枚金币.可以YY一下,奇数永远都受偶数的限制,他们非常可能

4-9 二叉树的遍历 (25分)

4-9 二叉树的遍历   (25分) 输出样例(对于图中给出的树): Inorder: D B E F A G H C I Preorder: A B D F E C G H I Postorder: D E F B H G I C A Levelorder: A B C D F G I E H 代码:(都是遍历的算法) 1 // 4-9 二叉树的遍历 2 // 3 // Created by Haoyu Guo on 04/02/2017. 4 // Copyright ? 2017 Haoy

5-24 树种统计 (25分)

5-24 树种统计   (25分) 随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类.请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比. 输入格式: 输入首先给出正整数N(\le 10^5≤10?5??),随后N行,每行给出卫星观测到的一棵树的种类名称.种类名称由不超过30个英文字母和空格组成(大小写不区分). 输出格式: 按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,保留小数点后4位. 输入样例: 29 Red Alder Ash Aspe

5-20 表达式转换 (25分)

5-20 表达式转换 (25分) 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程序将中缀表达式转换为后缀表达式. 输入格式: 输入在一行中给出不含空格的中缀表达式,可包含+.-.*.\以及左右括号( ),表达式不超过20个字符. 输出格式: 在一行中输出转换后的后缀表达式,要求不同对象(运算数.运算符号)之间以空格分隔,但结尾不得有多余空格. 输入样例: 2+3*(7-4)+8/4 输出样例: 2 3 7 4