【BZOJ2034】最大收益(贪心)

题面

BZOJ

题解

首先显然让价值越大的占用一个时刻一定更优。

所以把所有东西按照价值排序之后来处理,那么显然就是把前面的全部放好之后,考虑来放当前这个东西,如果能够放下那么就放,否则直接丢掉。

考虑如何检查是否能下放。

首先缩小区间的规模,对于每个位置,找到从他们的左端点开始,往右第一个未被标记的点标记,最后只有被标记的点才可能出现在匹配中。

那么记录每个点的匹配位置,然后从左往右考虑所有可以的匹配位置,如果当前位置没有匹配,则直接匹配。

否则如果当前位置匹配的东西的\([l,r]\)的\(r\)比这段区间的\(r\)大,则尝试能否匹配本来放的东西(因为它的\(r\)更大,更可能在后面找到一个匹配),如果不行则不行,否则则修改匹配有解。

这样子最多检查\(n\)个元素的匹配,而只需要加入\(n\)次,所以复杂度\(O(n^2)\)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
#define MAX 5050
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,p[MAX],book[MAX];ll ans;
struct Node{int l,r,v,p;}a[MAX];
bool cmpv(Node a,Node b){return a.v>b.v;}
bool cmpl(Node a,Node b){return a.l<b.l;}
bool check(int x,int pos)
{
if(p[pos]>a[x].r)return false;
if(!book[pos]){book[pos]=x;return true;}
if(a[book[pos]].r<=a[x].r)return check(x,pos+1);
else if(check(book[pos],pos+1)){book[pos]=x;return true;}
return false;
}
int main()
{
n=read();
for(int i=1;i<=n;++i)a[i].l=read(),a[i].r=read(),a[i].v=read();
sort(&a[1],&a[n+1],cmpl);
for(int i=1;i<=n;++i)p[i]=max(p[i-1]+1,a[i].l);
a[1].p=1;
for(int i=2;i<=n;++i)
{
a[i].p=a[i-1].p;
while(p[a[i].p]<a[i].l&&a[i].p<n)++a[i].p;
}
sort(&a[1],&a[n+1],cmpv);
for(int i=1;i<=n;++i)if(check(i,a[i].p))ans+=a[i].v;
printf("%lld\n",ans);
return 0;
}

【BZOJ2034】最大收益(贪心)的更多相关文章

  1. 【BZOJ2034】[2009国家集训队]最大收益 贪心优化最优匹配

    [BZOJ2034][2009国家集训队]最大收益 Description 给出N件单位时间任务,对于第i件任务,如果要完成该任务,需要占用[Si, Ti]间的某个时刻,且完成后会有Vi的收益.求最大 ...

  2. Bzoj2034 2009国家集训队试题 最大收益 贪心+各种优化+二分图

    这个题真的是太神了... 从一開始枚举到最后n方的转化,各种优化基本都用到了极致.... FQW的题解写了好多,个人感觉我全然没有在这里废话的必要了 直接看这里 各种方法真的是应有尽有 大概说下 首先 ...

  3. BZOJ 2034: [2009国家集训队]最大收益 [贪心优化 Hungary]

    2034: [2009国家集训队]最大收益 题意:\(n \le 5000\)个区间\(l,r\le 10^8\),每个区间可以选一个点得到val[i]的价值,每个点最多选1次,求最大价值 线段树优化 ...

  4. 「中山纪中集训省选组D1T1」最大收益 贪心

    题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...

  5. K - 贪心 基础

    FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containi ...

  6. BZOJ.2034.[2009国家集训队]最大收益(二分图匹配 贪心)

    题目链接 双倍经验:BZOJ.4276.[ONTAK2015]Bajtman i Okrągły Robin(然而是个权限题.区间略有不同) \(Description\) 有\(n\)个任务,完成一 ...

  7. [luogu P2647] 最大收益(贪心+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...

  8. 【bzoj2034】 2009国家集训队—最大收益

    http://www.lydsy.com/JudgeOnline/problem.php?id=2034 (题目链接) 题意 n个任务,每个任务只需要一个时刻就可以完成,完成后获得${W_i}$的收益 ...

  9. BZOJ2034 [2009国家集训队]最大收益

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

随机推荐

  1. 将iso镜像转换为docker镜像

    为什么不用官方的镜像? 不是不想使用,而是官方镜像提供的功能实在是太少了,不信的话,你pull一个ubuntu:latest的进行,你看有没有wget.curl.ssh这些功能,就连最简单的ifcon ...

  2. 正则校验:微信号,qq号,邮箱

    java判断微信号.手机.名字的正则表达 - willgos - 博客园https://www.cnblogs.com/solossl/p/5813106.html 微信号正则校验,qq正则,邮箱正则 ...

  3. 上传图片(photoClip)

    首先我们需要引入4个js包(这4个包总共106.6KB) <script src="__STATIC__/hammer.min.js" ></script> ...

  4. 四、Object.defineProperty总结

    Object.defineProperty() 参考:https://segmentfault.com/a/1190000007434923 定义: 方法会直接在一个对象上定义一个新属性,或者修改一个 ...

  5. linuxmint 搜狗输入法安装

    1.下载搜狗输入法linux安装包 2.进入安装包目录终端键入 dpkg -i [软件包名字] 3.设置语言选项中选择fcitx 4.重启电脑

  6. Linux基础学习笔记2-文件管理和重定向

    本节内容 1)文件系统结构元素 2)创建和查看文件 3)复制.转移和删除文件 4)软和硬链接 5)三种I/O设备 6)把I/O重定向至文件 7)使用管道 文件系统和结构 文件系统 文件和目录被组织成一 ...

  7. ubuntu18.04 安装 php7.2

    sudo apt-get install software-properties-common python-software-properties sudo add-apt-repository p ...

  8. mysql 分库分表备份脚本

    #!/bin/bash USER=root #用户 PASSWORD=123456 #密码 MYSQL_PATH=127.0.0.1 #地址 MYSQL_BIN=/bin/mysql MYSQL_DU ...

  9. MySQL系列:索引基本操作(4)

    1. 索引简介 索引是一种特殊的数据库结构,可以用来快速查询数据中的特定记录. MySQL中索引包括:普通索引.唯一性索引.全文索引.单列索引.多列索引和空间索引等. 1.1 索引定义 索引由数据库表 ...

  10. Armstrong公理

    从已知的一些函数依赖,可以推导出另外一些函数依赖,这就需要一系列推理规则,这些规则常被称作“Armstrong 公理”. 设U 是关系模式R 的属性集,F 是R 上成立的只涉及U 中属性的函数依赖集. ...