洛谷 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的贪心果然有难度 我们考虑在每次用加速器有两种情况 到下一个点还需要等待:以后的时间就不再影响了 到下一 ...
随机推荐
- Photon PUN 三 RPCs & RaiseEvent
官方文档地址 https://doc.photonengine.com/en-us/pun/current/manuals-and-demos/rpcsandraiseevent 一, RPC P ...
- Spine学习五- spine动画融合
在许多地方,都需要用到动画融合,unity的新版动画系统已经能够很方便的进行动画融合,那么使用spine的动画状态机的情况下,如何来进行动画融合呢? 官方有两种方案,一种是使用混合动作实现,另一种是使 ...
- linux命令的学习随笔
getconf PAGE_SIZE //获取内存分页的大小alias vi='vim'//临时生效vi /root/.bashrcwhereis ls输出重定向> >> 2> ...
- 关于Vue-Router的那些事儿
Vue-Router Vu-router是Vue.js的官方路由管理器,方便于构建页面,在我们的使用过程中,一般是在router的index.js文件中配置对应的组件和对应的路径 主要的功能 嵌套路由 ...
- Java的ArrayList实现随机生成N-M之间N个不重复的随机数
在此之前我使用Java的数组实现了产生N-M之间的不重复的随机数,下面是使用数列ArrayList实现同样的功能,代码如下: /** * 随机生成 N--M,N个不重复随机数 使用ArrayList ...
- 提交并发量的方法:Java GC tuning :Garbage collector
三色算法,高效率垃圾回收,jvm调优 Garbage collector:垃圾回收器 What garbage? 没有任何引用指向它的对象 JVM GC回收算法: 引用计数法(ReferenceCou ...
- 你准备好开始DevOps了吗?
前面一章节我们已经了解了Agile,CI/CD,DevOps,作为DevOps的起点,对于一个团队,如何开始自己的持续集成?根据我的经验,列出了一下需要考虑的点 1. 代码管理/分支策略 代码托管在哪 ...
- Beauty Contest(POJ 2187)
原题如下: Beauty Contest Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 42961 Accepted: ...
- Windows下安装Nginx及负载均衡
1.下载Windows版本的Nginx http://nginx.org/en/download.html 2.解压Nginx包,配置conf文件下的nginx.conf文件 3.配置说明: #use ...
- spring boot 源码之banner
Banner 使用Spring Boot启动的jar包总是会显示一个Spring的图标.实际我们是可以自定义这个图标.Banner接口定义了打印banner的方法. void printBanner( ...