题目链接:https://jzoj.net/senior/#contest/show/2414/2

题目描述:

鸡腿是CZYZ的著名DS,但是不想追妹子的DS不是好GFS,所以鸡腿想通过表白来达到他追到妹子的目的!虽然你对鸡腿很无语,但是故事的设定是你帮助鸡腿找到了妹子,所以现在你必须帮助鸡腿安排表白来实现故事的结局 !

鸡腿想到了一个很高(sha)明(bi)的做法,那就是去找人来组成表白队伍来增强气势 !鸡腿有很多好基友来帮忙,鸡腿数了数一共有N个人。但是鸡腿觉得大家排成两队来比较好看,而且鸡腿经过计算,第一队N1个人,第二队N2个人是最佳的队伍。问题来了...有些好基友们虽然很好心但是可能造成不好的影响(形象猥琐),所以鸡腿就给每个人打了分。Q1i表示第i个好基友排到第一队里时的好影响,C1i表示第i个好基友排到第一队里时的不良影响,Q2i表示第i个好基友排到第二队里时的好影响,C2i表示第i个好基友排到第二队里时的不良影响。请给鸡腿一种安排使得Q的和与C的和的比值最大,给出最大值。

Input

第一行给出三个整数N、N1、N2。

第2到N+1行,每行四个整数Q1,C1,Q2,C2。

Output

一行输出一个小数d表示最优化比例是d(保留6位小数)

 

Sample Input

5 2 2
12 5 8 3
9 4 9 4
7 3 16 6
11 5 7 5
18 10 6 3

Sample Output

2.444444

样例分析就略过了,其实我自己也没有仔细分析

下面直接开始讲题:

这道题的含义很好理解,有两个队列,每个人有各自的属性,我们要做的就是最优化

我们发现输出结果是个分数,考虑一下二分答案,发现若是答案t成立,则满足下面这个不等式:

∑(each k in Queue1)Q1k+∑(each k in Queue2)Q2k

----------------------------------------------------------- >=t

∑(each k in Queue1)C1k+∑(each k in Queue2)C2k

移项之后可以得到:

∑(each k in Queue1)(Q1k-C1k*t) +∑(each k in Queue2)(Q2k-C2k*t)>=0

于是这就是个01分数规划题

问题转化为构造最大的∑(each k in Queue1)(Q1k-C1k*t) +∑(each k in Queue2)(Q2k-C2k*t),怎么做呢?我们采用DP的方法

首先对于每一个人,我们计算出他的(q1i-c1i*t)-(q2i-c2i*t),注意中间是减号,为什么呢?我们考虑对最终答案的贡献,当然是越大越好,于是我们给这个新的属性(ne)从大到小排序

队列1从前向后取,队列二从后向前取。比如我们考虑大于0的情况,我们认为它是“靠前的”,那么显然放在队列1里面是比放在队列2里面好的,放在队列2里面就是负数了嘛

排序之后我们开始DP,用f[i][j] 表示前i 个人取了j 个进第一队的最大贡献,用g[i][j] 表示后i 个人取了j 个进第二队的最大贡献,最后用f[i][N1] +g[N-i][N2]来更新答案即可

若是满足大于等于0的条件,就l=mid,不满足r=mid

下面附上代码:

#include<bits/stdc++.h>
using namespace std; const int inf=1e9+;
const int maxn=;
int n,n1,n2;
double f[maxn][maxn],g[maxn][maxn];
struct NODE
{
double q1,c1,q2,c2,ne;
}m[maxn],k[maxn];
bool cmp(NODE a,NODE b) {return a.ne>b.ne;}
bool check(double t)
{
memset(f,-inf,sizeof(f));
memset(g,-inf,sizeof(g));
for (int i=;i<=n;i++) k[i]=m[i];
for (int i=;i<=n;i++)
k[i].ne=(k[i].q1-k[i].c1*t)-(k[i].q2-k[i].c2*t);
sort(k+,k++n,cmp);
f[][]=k[].q1-k[].c1*t;
f[][]=;
for (int i=;i<=n;i++)
for (int j=;j<=min(i,n1);j++)
{
f[i][j]=f[i-][j];
f[i][j]=max(f[i][j],f[i-][j-]+k[i].q1-k[i].c1*t);
}
g[][]=k[n].q2-k[n].c2*t;
g[][]=;
for (int i=;i<=n;i++)
for (int j=;j<=min(i,n2);j++)
{
g[i][j]=g[i-][j];
g[i][j]=max(g[i][j],g[i-][j-]+k[n-i+].q2-k[n-i+].c2*t);
}
double ans=-;
for (int i=;i<=n;i++)
if (i>=n1&&n-i>=n2) if (f[i][n1]+g[n-i][n2]>ans) ans=f[i][n1]+g[n-i][n2];
if (ans>=) return true;else return false;
}
int main()
{
//freopen("love.in","r",stdin);
//freopen("love.out","w",stdout);
scanf("%d%d%d",&n,&n1,&n2);
for (int i=;i<=n;i++)
scanf("%lf%lf%lf%lf",&m[i].q1,&m[i].c1,&m[i].q2,&m[i].c2);
double l=,r=2000.0,mid;
while (r-l>1e-)
{
mid=(l+r)/;
if (check(mid)) l=mid;
else r=mid;
}
printf("%.6f",mid);
return ;
}

jzoj3454 表白(love)解题报告(01分数规划+DP)的更多相关文章

  1. BZOJ5281: [Usaco2018 Open]Talent Show(01分数规划&DP)

    5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 166  Solved: 124[S ...

  2. $POJ$2976 $Dropping\ tests$ 01分数规划+贪心

    正解:01分数规划 解题报告: 传送门! 板子题鸭,,, 显然考虑变成$a[i]-mid\cdot b[i]$,显然无脑贪心下得选出最大的$k$个然后判断是否大于0就好(,,,这么弱智真的算贪心嘛$T ...

  3. POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)

    用01分数规划 + prime + 二分 竟然2950MS惊险的过了QAQ 前提是在TLE了好几次下过的 = = 题目意思:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一 ...

  4. 【usaco-Earthquake, 2001 Open】 0-1分数规划 & 最优比率生成树

    题意:给定n个点m条边,一开始这些边全都是断的,要修一些边使得n个点全部联通.修完一共可以得到F元,修一条边有成本di和时间ti,要使得 得到的钱数 / 总时间 这个比值最大. 参考资料: 红线内的内 ...

  5. POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】

    题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total ...

  6. [poj2976]Dropping tests(01分数规划,转化为二分解决或Dinkelbach算法)

    题意:有n场考试,给出每场答对的题数a和这场一共有几道题b,求去掉k场考试后,公式.的最大值 解题关键:01分数规划,double类型二分的写法(poj崩溃,未提交) 或者r-l<=1e-3(右 ...

  7. POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9703   Accepted: 3299 ...

  8. ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)

    [题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...

  9. POJ 2728 Desert King ★(01分数规划介绍 && 应用の最优比率生成树)

    [题意]每条路径有一个 cost 和 dist,求图中 sigma(cost) / sigma(dist) 最小的生成树. 标准的最优比率生成树,楼教主当年开场随手1YES然后把别人带错方向的题Orz ...

随机推荐

  1. HDU 4324 Contest 3

    直接DFS即可 #include <iostream> #include <string.h> #include <algorithm> #include < ...

  2. Restful技术

    一.概述 Restful技术是一种架构风格(Representational State Transfer)表现层状态转化,而不是一种编程标准. 之前前后端混在一起,前端通过mapping映射找到后端 ...

  3. 三种SVM的对偶问题

    一.SVM原问题及要变成对偶问题的解决办法 对于SVM的,我们知道其终于目的是求取一分类超平面,然后将新的数据带入这一分类超平面的方程中,推断输出结果的符号,从而推断新的数据的正负. 而求解svm分类 ...

  4. 修改YOLO使其显示自定义类别

    基本参考自这篇文章(http://blog.csdn.net/ma3252788/article/details/74659230),主要用来记录下自己遇到的问题 根据@赤战约风 的帖子做如下修改可以 ...

  5. 安卓WebView的使用,在应用程序中嵌入一个浏览器,轻松地展示各种各样的网页

    WebView 在应用程序中嵌入一个浏览器,轻松地展示各种各样的网页. 1.定义一个WebView位置 <?xml version="1.0" encoding=" ...

  6. CoreData 从入门到精通(五)CoreData 和 TableView 结合

    我们知道 CoreData 里存储的是具有相同结构的一系列数据的集合,TableView 正好是用列表来展示一系列具有相同结构的数据集合的.所以,要是 CoreData 和 TableView 能结合 ...

  7. 解读HDFS(转载)

    是蛮久木有写过关于hadoop的博客了额,虽然最近也看了一些关于linux的基础知识,但似乎把这个东西忘记了,其实时不时回顾一下以前的知识还是蛮有意思的,且行且忆! 我们Hadoop 主要由HDFS和 ...

  8. label标签的可访问性问题

    label标签可以优雅地扩大表单控件元素的点击区域.例如,单纯的单选框点击区域就鼻屎那么大的地方,经常会点不到位置.因此,label标签的使用对于提高页面的可用性可访问性是很有帮助的. 其实,它的样子 ...

  9. QT笔记 -- (5) 实现QWidget的paintEvent函数,在widget上画背景图形

    如图,想在界面上画个弧线和直线,于是继承QWidget得到类MainContainer,并实现了paintEvent函数.然后用类MainContainer定义centralWidget. MainC ...

  10. RMAN删除归档脚本

    crosscheck archivelog all;   delete noprompt expired archivelog all;   delete noprompt archivelog un ...