ZOJ - 3715贪心
ZOJ - 3715KindergartenElection
题目大意:幼儿园里正在举办班长选举,除1号小朋友外每个人都会投他最好的朋友,但1号小朋友可以贿赂别人(小伙子有丶想法),被贿赂的小朋友就会把票投给1号小朋友而不是他最好的朋友,对于不同的小朋友贿赂的花费也不同,1号小朋友想要自己是唯一的班长(票数最高),问他最少需要花费多少糖果?
由题目来想,很容易想到贪心,但是不知道怎么贪心。如果是简单让1号是票数最高的小朋友,他每次贿赂都有两种选择,一种是贿赂花费小的人来投他,另一种是贿赂票数比他高的小朋友的投票者中花费小的,如果这两种情况是同一个人的话,那还好说,但如果不是的话,那就不好判断了。所以我们转换思路,我们枚举1号小朋友能得到的票数为x,那么其他小朋友的票数应该小于x,否则1号小朋友应该贿赂他的投票者中一部分花费小的来让他的票数小于x,而如果那一部分贿赂完后,如果1号小朋友的票数大于x,那说明x这个票数是不合理的,1号小朋友应该得到多于x的票才能唯一最多票。而如果还不够x应该在剩下的小朋友里贿赂花费小的来达到x,然后更新答案。
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> > q[],p,temp;//由小到大的优先队列
int fri[];
int main()
{
int t,n,x;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
while(q[].size())//每次要先把队列清空
q[].pop();
for(int i=;i<=n;i++)
{
while(q[i].size())
q[i].pop();
scanf("%d",&fri[i]);
}
for(int i=;i<=n;i++)
{
scanf("%d",&x);
q[fri[i]].push(x);
}
int ans=0x3f3f3f3f;
//1号小朋友能得到的票数范围就是已经有的票数到n-1票数
for(int i=q[].size();i<=n-;i++)
{
int cost=,num=;
while(p.size())
p.pop();//p储存没有被贿赂的小朋友
for(int j=;j<=n;j++)
{
temp=q[j];
//如果这位小朋友的票数大于等于i那么应该把多的先贿赂了
while(temp.size()>=i&&temp.size())
{
num++;
cost+=temp.top();
temp.pop();
}
//剩下的储存到没被贿赂的小朋友里
while(temp.size())
{
p.push(temp.top());
temp.pop();
}
}
//如果当前的票数还没达到i则补够
while(q[].size()+num<i&&p.size())
{
num++;
cost+=p.top();
p.pop();
}
//当好等于i说明i这个答案合理
if(q[].size()+num==i&&cost<ans)
ans=cost;
}
printf("%d\n",ans);
}
return ;
}
优先队列
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> v[],vv;
int fri[],cdy[],book[];
bool cmp(const int &a,const int &b){
return cdy[a]<cdy[b];
}//按贿赂的糖果数由小到大排
int main()
{
int t,n,x;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
vv.clear();
v[].clear();
for(int i=;i<=n;i++)
{
v[i].clear();
book[i]=;
scanf("%d",&fri[i]);
}
for(int i=;i<=n;i++)
{
scanf("%d",&cdy[i]);
v[fri[i]].push_back(i);
if(fri[i]!=)//vv储存没有把票投给1号小朋友的小朋友
vv.push_back(i);
}
//因为贪心嘛,都先按花费由小到大排
sort(vv.begin(),vv.end(),cmp);
for(int i=;i<=n;i++)
sort(v[i].begin(),v[i].end(),cmp);
int ans=0x3f3f3f3f;
for(int i=v[].size();i<=n;i++)
{
int cost=,num=;
memset(book,,sizeof(book));
for(int j=;j<=n;j++)
if(v[j].size()>=i)
for(int k=;k<v[j].size()-i+&&k<v[j].size();k++)
{
cost+=cdy[v[j][k]];
book[v[j][k]]=;
num++;
}//多于i的部分先贿赂掉,并标记已经贿赂过了
for(int j=;j<vv.size()&&num+v[].size()<i;j++)
{
if(book[vv[j]])
continue;
cost+=cdy[vv[j]];
num++;
}
if(num+v[].size()==i&&cost<ans)
ans=cost;
}
printf("%d\n",ans);
}
return ;
}
vector标记
ZOJ - 3715贪心的更多相关文章
- Heap Partition ZOJ - 3963(贪心)
ZOJ - 3963 贪心做一下就好了 反正别用memset #include <iostream> #include <cstdio> #include <sstrea ...
- zoj 1375 贪心
https://vjudge.net/problem/ZOJ-1375 In modern day magic shows, passing through walls is very popular ...
- ZOJ 38727(贪心)
这道题真心坑.越想越远 想的飞起来了. 最后纠结起后缀表达式的定义来了. 题意: 就是给你一个串 , 让你用最少改动次数来实它变成一个合法的后缀表达式, 改动方式有两种, 一种是直接加入数字或者 ...
- ZOJ 3607贪心算法
http://blog.csdn.net/ffq5050139/article/details/7832991 http://blog.watashi.ws/1944/the-8th-zjpcpc/ ...
- ZOJ 3829 贪心 思维题
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...
- ZOJ 3715 Kindergarten Election
At the beginning of the semester in kindergarten, the n little kids (indexed from 1 to n, for conven ...
- ZOJ Problem Set - 3829Known Notation(贪心)
ZOJ Problem Set - 3829Known Notation(贪心) 题目链接 题目大意:给你一个后缀表达式(仅仅有数字和符号),可是这个后缀表达式的空格不幸丢失,如今给你一个这种后缀表达 ...
- 贪心+模拟 ZOJ 3829 Known Notation
题目传送门 /* 题意:一串字符串,问要最少操作数使得成为合法的后缀表达式 贪心+模拟:数字个数 >= *个数+1 所以若数字少了先补上在前面,然后把不合法的*和最后的数字交换,记录次数 岛娘的 ...
- 【贪心+一点小思路】Zoj - 3829 Known Notation
借用别人一句话,还以为是个高贵的dp... ... 一打眼一看是波兰式的题,有点懵还以为要用后缀表达式或者dp以下什么什么的,比赛后半阶段才开始仔细研究这题发现贪心就能搞,奈何读错题了!!交换的时候可 ...
随机推荐
- 数据结构-二叉搜索树Java实现
1,Node.java 生成基础二叉树的结构 package com.cnblogs.mufasa.searchTree; /** * 节点配置父+左+右 */ public class Node{ ...
- 【weixin】微信支付简介
一.微信支付模式 1.付款码支付 付款码支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式.主要应用线下面对面收银的场景. 2.Native支付 Native支付是商户系 ...
- react的嵌套组件
react没有vue插槽的概念,但是有嵌套组件,可以用嵌套组件实现类似插槽的功能.下例中,color,name,btn相当于具名插槽,children相当于匿名插槽. import React fro ...
- O058、Snapshot Volume 操作
参考https://www.cnblogs.com/CloudMan6/p/5657744.html Snapshot 可以为 volume 创建快照,快照中保存了 volume当前的状态,以后可 ...
- eclipse中ctrl+1什么意思
eclipse中ctrl+1是一个快捷键,能快速的现实光标所在行的问题,并给出一些修改方案. 当eclipse编辑器在你编辑代码阶段,能检测到编辑时异常(错误)会在错误代码行前面出现一个红色的叉叉,这 ...
- linux下共享热点抓包
Linux有一个抓包工具叫tcpdump,这个命令还是挺强大的.简单列举一下它的参数 # tcpdump -h tcpdump version 4.9.2 libpcap version 1.8.1 ...
- 5、SVN 权限管理
5.SVN 权限管理 5.1版本库中三个对应的配置文件 版本库配置文件目录 /var/svn/repository/pro_oa/conf svnserve.conf 文件,如下修改: 19# ano ...
- SQL Server 2005 实现数据库同步备份 过程--结果---分析
数据库复制: 简单来说,数据库复制就是由两台服务器,主服务器和备份服务器,主服务器修改后,备份服务器自动修改. 复制的模式有两种:推送模式和请求模式,推送模式是主服务器修改后,自动发给备份服务器, ...
- python常用模块:标准文件及模块练习
1.请写出规范目录 并解释各文件夹的作用 bin 执行文件core 核心业务逻辑conf 配置文件lib 库.公共代码.第三方模块db 数据分析log 日志文件readme 文本文档 2.改造atm+ ...
- Hive-ha (十三)
hive-high Avaliable hive的搭建方式有三种,分别是 1.Local/Embedded Metastore Database (Derby) 2.Remote Meta ...