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以下什么什么的,比赛后半阶段才开始仔细研究这题发现贪心就能搞,奈何读错题了!!交换的时候可 ...
随机推荐
- 并不对劲的复健训练-p5212 SubString
题目大意 有一个串\(s\),一开始只知道它的一个前缀.有\(q\)(\(q\leq 10^4\))个操作,操作有两种:1.给一个字符串,表示\(s\)(\(s\)总长\(\leq 6\times 1 ...
- 开始写下自己的python的cocos2d, pyglet学习
开始写下自己的python的cocos2d, pyglet学习 2014年01月18日 13:52:36 我要做程序达人 阅读数 9051更多 分类专栏: python的cocos2d和pyglet ...
- 高性能MySQL3_笔记0
该书2015年5月出版的,实际上已经有些老了,但是经典的东西还是经典. 该书一共16章 1.Mysql的架构与历史 2.Mysql基准测试 3.服务器性能剖析 4.Schema与数据类型优化 5.创建 ...
- codeforce C. Success Rate
写完这道题目才发现自己对二分的理解太浅了 这题是典型的利用二分“假定一个问题可行并求最优解” 二分是通过不断缩小区间来缩小解的范围,最终得出解的算法 我们定义一个c(x) 表示判断函数 如果对任意y& ...
- 进阶Java编程(7)反射机制
反射机制 1,反射机制简介 在Java语言里面之所以会有如此多的开源技术支撑,很大的一部分是来自于Java最大的特征[反射机制].如果你不能够使用反射机制去进行项目的开发与设计,那么可以说你并未接触到 ...
- 连接云服务器中MySql数据库遇到的问题
使用的免费的云服务器,上面只能下载MySql数据库,不过当云数据库使用绰绰有余了,也就放一些测试数据而已 而且上面只可以部署php项目,.netcore项目部署实现比较麻烦 问题如下: 下载了navi ...
- vue打开到新页面,并传递参数
打开新页面,有两种方式, 一种是标签式: <router-link tag="a" target="_blank" :to="{path: '/ ...
- sql注入搞事情(连载二)
sql注入(连载二)安信华web弱点测试系统注入 好多人问我sql怎么学习,我一下也说不出来.我就在此做统一的解答: sql语句分为两种,不管怎么用还是怎么学习主要是要理解SQL语句的基本概念,框架, ...
- IoU-Net论文笔记
原论文标题:Acquisition of Localization Confidence for Accurate Object Detection 1. 前言 Megvii在ECCV 2018上的一 ...
- Percona MongoDB 4 搭建副本集
什么是副本集: 是一组维护相同数据集的mongod进程 提供冗余,自动故障转移和高可用性 提供读取可伸缩性 内部概念或多或少与MySQL的概念相似 PRIMARY概念与MySQL复制中的MASTER大 ...