洛谷 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的贪心果然有难度 我们考虑在每次用加速器有两种情况 到下一个点还需要等待:以后的时间就不再影响了 到下一 ...
随机推荐
- Java 与 Mysql连接,并分页显示
这是我第一个上规模的Java项目,我们必须在一周内完成的作业,零基础学习Java,网上收集了很多资料,逐渐对面向对象的思想有所了解,但还是半灌水,后期打算结合项目系统地学习一遍Java.老师布置的任务 ...
- 搭建lnmp环境,nginx的配置文件/etc/nginx/nginx.conf
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...
- 2vscode user settings
{ "editor.accessibilityPageSize": 14, "editor.fontSize": 14, "editor. ...
- WebLogic12C安装配置文档
jdk版本:1.8; jdk安装路径不准有空格 JDK安装: jdk版本:1.8; jdk安装路径不准有空格 WebLogic安装: 解压安装包 解压JAR 找到fmw_12.2.1.3.0_wls\ ...
- leetcode刷题-40组合总和2
题目 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用 ...
- 学会使用BeanUtils,提高你的开发效率
一.关于BeanUtils 一说到BeanUtils,大家可能不清楚指的哪个BeanUtils.因为它在很多包里面都有,其中挺常用的就是 (1)org.apache.commons.beanutils ...
- unserialize3 攻防世界
序列化是将对象转换为便于保存的字符串, 而反序列化是将便于保存的字符串转换为字符串. _wakeup()魔法方法 如果直接传参给code会被__wakeup()函数再次序列化,所以要绕过他, 利用__ ...
- Python3 学习笔记之 数据类型
- Spring Cloud Alibaba微服务生态的基础实践
目录 一.背景 二.初识Spring Cloud Alibaba 三.Nacos的基础实践 3.1 安装Nacos并启动服务 3.2 建立微服务并向Nacos注册服务 3.3 建立微服务消费者进行服务 ...
- 图灵机器人api的使用方法含微信版本和网页版
访问图灵机器人官网http://www.tuling123.com/ 注册一个新的机器人账号 注册成功后转到主页 点击我的机器人>创建机器人>微信机器人 填写基本信息 点击微信介入> ...