博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bzoj2034 2009国家集训队试题 最大收益 贪心+各种优化+二分图
阅读量:5292 次
发布时间:2019-06-14

本文共 1404 字,大约阅读时间需要 4 分钟。

这个题真的是太神了。。。

从一開始枚举到最后n方的转化,各种优化基本都用到了极致。。。。

FQW的题解写了好多,个人感觉我全然没有在这里废话的必要了

直接

各种方法真的是应有尽有

大概说下

首先能够想到一个KM算法求二分图最大代权匹配的问题对吧

左边是任务右边是时间

可是这个是三次方啊

那我们就按价值排序,这样就不用代权匹配了可是还是三方

可是左边在右边的连线是单调的。。。

所以就能够贪心推断了。。。

#include
#include
#include
#include
#define MAX 5010#define rep(i,j,k) for(int i = j; i <= k; i++)using namespace std;int n, Link[MAX];long long ans = 0;int b[MAX];struct wbysr{ int Begin, end, value;} a[MAX];bool cmp (wbysr a1, wbysr a2){ return a1.Begin < a2.Begin || (a1.Begin == a2.Begin && a1.end < a2.end);}bool cmp2 (wbysr a1, wbysr a2){ return a1.value > a2.value;}bool find (int now, int x){ if (b[x] > a[now].end) return 0; if (!Link[x]) { Link[x] = now; return 1; } int j = Link[x]; if (a[now].end > a[j].end) return find (now,x + 1); else { if (find(j, x + 1)) { Link[x] = now; return 1; } } return 0;}int main(){ scanf ("%d", &n); rep (i, 1, n) scanf ("%d%d%d", &a[i].Begin, &a[i].end, &a[i].value); sort (a + 1, a + 1 + n, cmp); int now = 0; rep (i, 1, n) { now = max (now + 1, a[i].Begin); b[i] = now; } sort (a + 1, a + 1 + n, cmp2); b[n+1] = 0x7fffffff / 3; rep (i, 1, n) { int j; for (j = 1; j <= n; j++) if (b[j] >= a[i].Begin && b[j] <= a[i].end) break; if (find(i, j)) ans += a[i].value; } cout << ans << endl; return 0;}

转载于:https://www.cnblogs.com/hrhguanli/p/3900837.html

你可能感兴趣的文章
LeetCode : Ugly Number
查看>>
android学习笔记三
查看>>
常见算法之‘选择排序’
查看>>
Java学习笔记39(转换流)
查看>>
计算一个圆的直径面积周长
查看>>
XSS攻击及防御
查看>>
7.29 DFS总结
查看>>
c++操作io常见命令
查看>>
页面JS引用添加随机参数避免页面缓存
查看>>
java的基础知识文件操作和标识符
查看>>
Tika解析word文件
查看>>
变量作用域
查看>>
.NET程序集签名
查看>>
Python操作列表
查看>>
java reflect反射---Java高级开发必须懂的
查看>>
18.5 线程的优先级
查看>>
sessionStorage/localStorage 本地存储
查看>>
SVN设置必须锁定
查看>>
Oracle 手动建库
查看>>
《架构之美》阅读笔记04
查看>>