洛谷 P6851 【onu】贪心
题目描述
分析
因为小 \(D\) 打出的牌与小 \(C\) 打出的牌花色必须相同,所以我们需要按照花色分类讨论
对于某一种花色
如果小 \(C\) 没有这种花色的牌但是小 \(D\) 有,那么小 \(D\) 的牌一定打不出去,直接 \(continue\) 掉
如果小 \(C\) 有这种花色的牌,那么对于小 \(D\) 来说,他肯定想让他赢的次数尽可能多
这其实就是一个田忌赛马的问题
我们把小 \(C\) 和小 \(D\) 的牌按照点数从大到小排序
对于小 \(D\) 的每一张牌,我们在小 \(C\) 小于等于这张牌点数的牌里选择点数最大的那一张与其配对
因为消耗一个点数大的牌肯定更优,这样可以为之后的牌创造更多的获胜机会
因为小 \(D\) 的牌的点数是单调递减的,所以选出的牌的点数也一定是单调递减的
因此,我们可以用一个指针维护
这样到最后小 \(D\) 的牌要么都打光,要么剩下一些
对于剩下的牌,我们随便配对就可以了,因为打出去肯定比不打出去更优
在匹配的过程中如果小 \(C\) 的牌不够用,那么就停止匹配
如果小 \(D\) 的牌打光后小 \(C\) 还剩下牌,那么小 \(D\) 只能选择弃权
代码
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#define rg register
struct asd{
int id,val;
asd(){}
asd(int aa,int bb){ id=aa,val=bb; }
};
bool cmp(asd aa,asd bb){
return aa.val>bb.val;
}
const int maxn=1e5+5;
std::vector<asd> gd[maxn],gc[maxn];
int ans[maxn],n,m,maxid;
long long c,v;
bool vis[maxn];
void solve(int id){
if(gc[id].size()==0) return;
rg int head=0,js=0;
for(rg int i=0;i<gd[id].size();i++){
rg int cs=gd[id][i].val;
if(head>=gc[id].size()) break;
while(1){
if(gc[id][head].val>cs) head++;
if(head>=gc[id].size()) break;
if(gc[id][head].val<=cs){
ans[gc[id][head].id]=gd[id][i].id;
vis[gc[id][head].id]=1;
v=v+c+gd[id][i].val;
head++,js++;
break;
}
}
}
for(rg int i=0;i<gc[id].size();i++){
rg int now=gc[id][i].id;
if(vis[now]) continue;
if(js>=gd[id].size()){
ans[now]=-1;
vis[now]=1;
v=v-c;
} else {
ans[now]=gd[id][js].id;
v=v-c+gd[id][js].val;
vis[now]=1;
js++;
}
}
}
int main(){
scanf("%d%d%lld%lld",&n,&m,&c,&v);
rg int aa,bb;
for(rg int i=1;i<=n;i++){
scanf("%d%d",&aa,&bb);
gd[aa].push_back(asd(i,bb));
maxid=std::max(maxid,aa);
}
for(rg int i=1;i<=m;i++){
scanf("%d%d",&aa,&bb);
gc[aa].push_back(asd(i,bb));
maxid=std::max(maxid,aa);
}
for(rg int i=1;i<=maxid;i++){
std::sort(gd[i].begin(),gd[i].end(),cmp);
std::sort(gc[i].begin(),gc[i].end(),cmp);
}
for(rg int i=1;i<=maxid;i++) solve(i);
printf("%lld\n",v);
for(rg int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}
洛谷 P6851 【onu】贪心的更多相关文章
- 洛谷 P6851 onu (贪心,模拟)
题意:C和D打牌,每张牌有花色和点数,小D刚开始的分数为\(v\),不管输还是赢,只要小D出了牌(花色必须相同),就能得到那张牌点数的分数,若是赢了(点数不小于D的牌),他可以另外加\(c\)分,输了 ...
- 洛谷 P3049 Landscaping ( 贪心 || DP)
题意 : 有n块土地,每块有A[i]泥土,现把其改造成B[i]泥土,有3种操作:(1)花费X向任意土地增加1泥土:(2)花费Y向任意土地减少1泥土:(3)花费Z*|i-j|把土地i的1泥土运到土地j. ...
- 洛谷P2831 愤怒的小鸟——贪心?状压DP
题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ...
- 洛谷P3602 Koishi Loves Segments(贪心,multiset)
洛谷题目传送门 贪心小水题. 把线段按左端点从小到大排序,限制点也是从小到大排序,然后一起扫一遍. 对于每一个限制点实时维护覆盖它的所有线段,如果超过限制,则贪心地把右端点最大的线段永远删去,不计入答 ...
- 洛谷P4155 [SCOI2015]国旗计划(贪心,树形结构,基数排序)
洛谷题目传送门 \(O(n)\)算法来啦! 复杂度优化的思路是建立在倍增思路的基础上的,看看楼上几位巨佬的描述吧. 首先数组倍长是一样的.倍增法对于快速找到\(j\)满足\(l_j+m\le r_i\ ...
- 洛谷P1084 疫情控制(NOIP2012)(二分答案,贪心,树形DP)
洛谷题目传送门 费了几个小时杠掉此题,如果不是那水水的数据的话,跟列队的难度真的是有得一比... 话说蒟蒻仔细翻了所有的题解,发现巨佬写的都是倍增,复杂度是\(O(n\log n\log nw)\)的 ...
- 洛谷P3613 睡觉困难综合征(LCT,贪心)
洛谷题目传送门 膜拜神犇出题人管理员!!膜拜yler和ZSY!! 没错yler连续教我这个蒟蒻写起床困难综合症和睡觉困难综合症%%%Orz,所以按位贪心的思路可以继承下来 这里最好还是写树剖吧,不过我 ...
- 【题解】洛谷P2577 [ZJOI2005] 午餐(DP+贪心)
次元传送门:洛谷P2577 思路 首先贪心是必须的 我们能感性地理解出吃饭慢的必须先吃饭(结合一下生活) 因此我们可以先按吃饭时间从大到小排序 然后就能自然地想到用f[i][j][k]表示前i个人在第 ...
- 【题解】洛谷P1315 [NOIP2011TG] 观光公交(前缀和+贪心)
次元传送门:洛谷P1315 思路 思路大概想到了 可是代码实现却没想到 所以参考题解了 D2T3的贪心果然有难度 我们考虑在每次用加速器有两种情况 到下一个点还需要等待:以后的时间就不再影响了 到下一 ...
随机推荐
- 利用阿里云服务器免费体验word press博客、个人网站
本文首发于我的个人博客:https://chens.life/create-wordpress-blog.html 前言 目前市面上有许许多多的虚拟云服务器ECS,例如阿里云.华为云.又拍云等等,他们 ...
- 关于`ClawHub的技术分享`公众号
生命不息,折腾不止! 该公众号的内容大部分为平时学习积累所整理的笔记,包括但不限于源码.原理.经验等. 如果感兴趣,也可以访问clawhub的博客主站https://clawhub.club
- [bash]查找指定目录下符合格式的txt文件
需求: 查找指定目录下符合yyyy-MM-dd(-b)NNN.txt格式的文件,如“2020-03-22-b888.txt” 目标目录内容: [root@localhost bashs]# ll /r ...
- Flash 0day(CVE-2018-4878)复现过程
一.前言介绍 2018年2月1号,Adobe官方发布安全通报(APSA18-01),声明Adobe Flash 28.0.0.137及其之前的版本,存在高危漏洞(CVE-2018-4878). 从Ad ...
- (python)生产者消费者模型
生产者消费者模型当中有两大类重要的角色,一个是生产者(负责造数据的任务),另一个是消费者(接收造出来的数据进行进一步的操作). 为什么要使用生产者消费者模型? 在并发编程中,如果生产者处理速度很快,而 ...
- pytorch常用函数总结(持续更新)
pytorch常用函数总结(持续更新) torch.max(input,dim) 求取指定维度上的最大值,,返回输入张量给定维度上每行的最大值,并同时返回每个最大值的位置索引.比如: demo.sha ...
- dict字典,以及字典的一些基本应用
dict表示方法: dict={}或d=dict() 1.字典的增:d['元素名']='元素值'.或d.setdefault('key','value') 2.字典的删:d.pop(key).或del ...
- 线上问题排查-HBase写数据出现NotServingRegionException(Region ... is not online)异常
今天线上遇到一个问题:有一台服务器的cpu持续冲高,排查发现是我们的一个java应用进程造成的,该进程在向hbase中写入数据时,日志不断地打印下面的异常: org.apache.hadoop.hba ...
- VS2017报错:未识别符vector
解决办法:添加头文件#include<vector>,添加命名空间 using namespace std.
- python中random库的使用
基本随机函数 计算机产生随机数是需要随机数种子的,例如 给定一个随机数种子,就能利用梅森旋转算法产生一系列随机序列 每一个数都是随机数,只要随机种子相同,产生的随机数和数之间的关系都是确定的 随机种子 ...