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以下什么什么的,比赛后半阶段才开始仔细研究这题发现贪心就能搞,奈何读错题了!!交换的时候可 ...
随机推荐
- X86逆向2:提取按钮通杀特征码
本章我们将学习特征码的提取与定位,特征码是软件中一段固定的具有标志性的代码片段,特征码的用途非常广泛,最常见的就是杀毒软件的查杀了,查杀就是根据特征码定位技术实现的,再比如木马的免杀也是修改了特征码的 ...
- go 拼接sql
//原文链接:https://www.jianshu.com/p/a0569157c418 golang mysql拼接子查询 使用fmt.Sprintf拼接SQL 实例代码 func Select( ...
- 在react项目当中做导航守卫
距离上一篇文章,似乎已经过去好久了. 确实是最近相对忙了一点,本身是用vue重构之前一个传统的项目,就自己一个人写.而且,在稍微闲暇之余,想着同时用react也重构一遍,也算是对react的学习吧!毕 ...
- Python爬虫实战小项目
爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据 import requests from fake_useragent import UserAgent ua = UserAge ...
- scrapy操作指南
Scrapy安装:(scrapy依赖包过多推荐使用下面的方法) 先安装Anaconda,然后 运行conda install Scrapy 创建scrapy项目: 1,scrapy startproj ...
- CSS3总结七:变换(transform)
2D视图模型解析 3D视图模型解析 平移 旋转 伸缩 扭曲 z轴方向平移与perspective的神秘关系 matrix()终极变幻的方法 一.2D视图 2D视图就是默认平面上的每个点都与视线垂直,图 ...
- href="javascript:show_login()"意思
整句话意味着当你点击一个超链接时,你会触发函数show_login. Href是一个超链接,通过单击该超链接触发. javascript:后面是JS代码 show_login():表示JS的函数的油烟 ...
- 使用hbuilder打包时,调用地图和相机
<template> <div class="comCon"> <!-- 你是头部区域的内容 --> <headback class=&q ...
- sql注入搞事情(连载二)
sql注入(连载二)安信华web弱点测试系统注入 好多人问我sql怎么学习,我一下也说不出来.我就在此做统一的解答: sql语句分为两种,不管怎么用还是怎么学习主要是要理解SQL语句的基本概念,框架, ...
- -bash: ls: No such file or directory 错误的原因及解决办法
ubuntu出现如下错误: { Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-42-generic x86_64) * Documentation: ...