Kindergarten Election

2024-01-25 11:10
文章标签 election kindergarten

本文主要是介绍Kindergarten Election,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3715

题意:有N个孩子投票选举leader,不能自己选自己。Sheldon想做leader,所以他就用糖果贿赂其他人,别的孩子就会将票投给他。问Sheldon最少要送多少糖果。

思路:枚举Sheldon做leader的票数(Sheldon原始的票数<= i < 100),将所有票数比他高的kid的得票一直减到票数比他少(按照给得票高的人投票的孩子所要的糖果数从小到大减),如果最后Sheldon的票数还是不够,就贿赂没投给他票且要的糖果数少的孩纸。最后输出花费的最少的糖果数。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 const int INF=1<<28;
 6 int m[102][102];
 7 int vis[102],sum[102];
 8 
 9 struct node
10 {
11     int kid;
12     int candy;
13     friend bool operator <(node a,node b)
14     {
15         return a.candy < b.candy; //按糖果数排序
16     }
17 } c[102];
18 int main()
19 {
20     int t,n,x;
21     scanf("%d",&t);
22     while(t--)
23     {
24         scanf("%d",&n);
25         memset(sum,0,sizeof(sum));
26         memset(m,0,sizeof(m));
27         for (int i = 2; i <= n; i++)
28         {
29             scanf("%d",&x);
30             m[i][x] = 1;//表示第i个孩子将票投给了x
31             sum[x]++;//记录每个人的得票数
32         }
33         for (int i = 2; i <= n; i++)
34         {
35             scanf("%d",&x);
36             c[i-2].kid = i; //将贿赂第i个孩子所需的糖果数保存在数组c中 
37             c[i-2].candy = x;
38         }
39         sort(c,c+n-1);//按糖果数排序
40         int Min = INF;
41         for (int i = sum[1]; i < n; i++)//枚举胜出的票数
42         {
43             if(i==0) continue;
44             int get = sum[1];//Sheldon的原始票数
45             int num = 0; //记录所需的糖果数
46             memset(vis,0,sizeof(vis));
47             for (int j = 2; j <= n; j++)
48             {
49                 int temp = sum[j];
50                 if (temp >= i)//处理所有票数比他高的
51                 {
52                     for (int k = 0; k < n-1; k++)
53                     {
54                         if (m[c[k].kid][j])
55                         {
56                             vis[c[k].kid] = 1;
57                             num+=c[k].candy;
58                             get++;
59                             temp--;
60                             if (temp < i)
61                                 break;
62                         }
63                     }
64                 }
65             }
66             if (get <= i)
67             {
68                 for (int k = 0; k < n-1; k++)
69                 {
70                     if (get==i)
71                         break;
72                     if (!vis[c[k].kid])
73                     {
74                         get++;
75                         num+=c[k].candy;
76                     }
77                 }
78                 if(num < Min) Min = num;
79             }
80         }
81         printf("%d\n",Min);
82     }
83     return 0;
84 }
View Code

 

 

转载于:https://www.cnblogs.com/lahblogs/p/3587246.html

这篇关于Kindergarten Election的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/643068

相关文章

ZOJ 3715 Kindergarten Election

题意: n个人投票  唯一一个票数最多的人当选  1想当选  他可以通过给别人糖让不选他的人选他  问  最少需要多少糖 思路: 由于n比较小  可以枚举1当选时得了多少票  这样就可以贪心的使用糖 如果1当选时有i票  那么所有人都要先保证选票数<i  而且还要保证至少一个人<i-1  因为1还会投出一票 保证上述条件下  如果1票数已经超过i  则说明这次枚举是失败的  如果不

RAFT实现之leader election

RAFT实现之leader election 测试全部通过 leader选举基本流程 所有节点以follower启动 follower的选举时钟超时,转为candidate candidate向其他节点发送投票请求,如果收到过半节点的投票,则成为leader leader周期性向其他节点发送心跳包以维持权威 实现关键点: 1.状态转移: raft节点的状态转移要严格依据下图,不管节点处于什么状态

poj 3692 Kindergarten(最大独立点集 + 二分图最大匹配)

http://poj.org/problem?id=3692 题意:在幼儿园中,有许多小孩。其中有男孩,也有女孩。女孩之间相互认识,男孩之间也相互认识。同时,一些男孩和女孩之间也相互认识,有一天,老师希望从所有人之中选出一些人来玩游戏,这个游戏需要所有的参与者之间相互认识,问老师可以最多找出多少人来玩这个游戏。 思路: 如果将男孩女孩看做顶点,男女之间的认识关系看做边,那么本题就

Codeforces Round #276 (Div. 1) D. Kindergarten

题意是将一段序列分割成几段,使得这几段的极差和最大。 首先,我们可以发现,最终的被分出来的序列都应该是单调的,如果你是形如 4 6 1 的,很可能可以将4或者1分割出去得到更大的值 上述的情况下,在一定程度上让一段序列的元素少,这样构成的序列更多,获得的值也就可能越大 a[i-1] < a[i]  < a[i+1]        dp[i] = dp[i-1] + a[i+1]

Cannot open channel to 2 at election address CentOSA/192.168.184.128:3888 解决办法

解决办法 1、先确定网络是否正常? 2、先确定zk是否启动成功? 重新启动一下Zk即可!  /opt/modules/zookeeper-3.4.5#进入后,使用下面命令启动正常 bin/zkServer.sh start## sh zkServer.sh start 启动回报错误 LOOKING (my state) 2020-02-07 13:49:18,539 [myi

Kafka Replication Leader election

Kafka从0.8开始提供partition级别的replication,replication的数量可在$KAFKA_HOME/config/server.properties中配置。 default.replication.factor = 1       在Replication与leader election配合提供了自动的failover机制。replication对Ka

【二分图最大独立集】POJ 3692:Kindergarten

一、题目内容 POJ 3692 原题地址 二、题意解释 一群男孩女孩,同性之间都相互认识,但是异性之间只有某些人认识彼此。给出相互认识的异性的各自编号。求组成一个小队,这个小队里的人都相互认识。问这个小队最多能有多少人。 三、代码及注释 #include<stdio.h>#include<iostream>#include<string.h>using namespace st

[ABC329D] Election Quick Report

链接:[ABC329D] Election Quick Report - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意翻译 共有 n 个人,有 m 次投票,每次会投给这 n 个人中的其中一个,问每次投票后得票最多的人是谁,如果有多个人同时得票最多,输出编号最小的。 输入输出样例 输入 3 71 2 2 3 1 3 3 输出 #1复制 11221

zookeeper 集群 Cannot open channel to X at election address Error contacting service. It is probably n

高概率:1端口占用    查看某一端口是否被占用 netstat -tunlp |grep 2181 2 配置不对:如下帖       1.问题现象。 启动每一个都提示  STARTED 但是查看 status时全部节点都报错 [root@ip-172-31-19-246 bin]# sh zkServer.sh  start ZooKeeper JMX enabled by d

1011. Kindergarten Physics (思维 / 输出) 2020 Multi-University Training Contest 4

传送门 思路: 题意:有两科重a,b kg的求,初始时候相距d距离,只受重力影响,试问t0时间后他们之间的距离。感情这就是个假物理题,我想着他们只受重力作用那距离可不是就不会变嘛,之间输出d不就行了。官方题解: 代码实现: #include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long