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贪心的更多相关文章

  1. Heap Partition ZOJ - 3963(贪心)

    ZOJ - 3963 贪心做一下就好了 反正别用memset #include <iostream> #include <cstdio> #include <sstrea ...

  2. zoj 1375 贪心

    https://vjudge.net/problem/ZOJ-1375 In modern day magic shows, passing through walls is very popular ...

  3. ZOJ 38727(贪心)

    这道题真心坑.越想越远  想的飞起来了. 最后纠结起后缀表达式的定义来了. 题意: 就是给你一个串 ,  让你用最少改动次数来实它变成一个合法的后缀表达式,  改动方式有两种, 一种是直接加入数字或者 ...

  4. ZOJ 3607贪心算法

    http://blog.csdn.net/ffq5050139/article/details/7832991 http://blog.watashi.ws/1944/the-8th-zjpcpc/ ...

  5. ZOJ 3829 贪心 思维题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...

  6. ZOJ 3715 Kindergarten Election

    At the beginning of the semester in kindergarten, the n little kids (indexed from 1 to n, for conven ...

  7. ZOJ Problem Set - 3829Known Notation(贪心)

    ZOJ Problem Set - 3829Known Notation(贪心) 题目链接 题目大意:给你一个后缀表达式(仅仅有数字和符号),可是这个后缀表达式的空格不幸丢失,如今给你一个这种后缀表达 ...

  8. 贪心+模拟 ZOJ 3829 Known Notation

    题目传送门 /* 题意:一串字符串,问要最少操作数使得成为合法的后缀表达式 贪心+模拟:数字个数 >= *个数+1 所以若数字少了先补上在前面,然后把不合法的*和最后的数字交换,记录次数 岛娘的 ...

  9. 【贪心+一点小思路】Zoj - 3829 Known Notation

    借用别人一句话,还以为是个高贵的dp... ... 一打眼一看是波兰式的题,有点懵还以为要用后缀表达式或者dp以下什么什么的,比赛后半阶段才开始仔细研究这题发现贪心就能搞,奈何读错题了!!交换的时候可 ...

随机推荐

  1. 对CSRF(跨站请求伪造)的理解

    一.什么是CSRF? CSRF是Cross Site Request Forgery的缩写,翻译过来就是跨站请求伪造.那么什么是跨站请求伪造呢?让我一个词一个词的解释: 1.跨站:顾名思义,就是从一个 ...

  2. Redis 键空间事件通知

    出处: 使用Redis完成定时任务 场景   使用Java做过项目的人大概都用过定时器.一般来说,项目里订单模块和评论模块,都会涉及到定时任务执行.比如说: 用户下订单后,需要在5分钟内完成支付,否则 ...

  3. vs 2017创建类时的默认模板修改

    思路:找到vs 2017安装目录---->找到模板文件---->修改 一般安装目录: C:\Program Files (x86)\Microsoft Visual Studio\2017 ...

  4. C#键盘事件

    一: protected override void OnKeyDown(KeyEventArgs e) { if (e.Key==Key.Enter) { sendAppToServer(); } ...

  5. Centos7:nginx的安装,配置及使用

    安装依赖 yum install gcc-c++//gcc环境 yum install -y pcre pcre-devel//PCRE:nginx的http模块使用pcre来解析正则表达式 yum ...

  6. java面试1

    1.面向对象的特征·有·哪些方面 1)抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽 ...

  7. 阿里巴巴开源框架java诊断工具--Arthas

    下载:arthas wget https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar --target-i ...

  8. <(* ̄▽ ̄*)/低碳生活管理系统

    首次在博客园发布文章,都是个人理解,有很多不足,多多包涵. 下面是对做过的作业低碳生活管理系统的剖析: 一:(建类) 二:(在Program[或自己命名的类]里调用SQL命名空间) 三:(Main方法 ...

  9. CNN for NLP(2)

    参考链接: 卷积神经网络(CNN)在句子建模上的应用, 卷积神经网络CNN在自然语言处理中的应用, CNN在NLP中的应用.

  10. PAT乙级1031

    题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805290334011392 题解 emmm.对于每个身份证号, ...