jzoj3454 表白(love)解题报告(01分数规划+DP)
题目链接: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)的更多相关文章
- BZOJ5281: [Usaco2018 Open]Talent Show(01分数规划&DP)
5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 166 Solved: 124[S ...
- $POJ$2976 $Dropping\ tests$ 01分数规划+贪心
正解:01分数规划 解题报告: 传送门! 板子题鸭,,, 显然考虑变成$a[i]-mid\cdot b[i]$,显然无脑贪心下得选出最大的$k$个然后判断是否大于0就好(,,,这么弱智真的算贪心嘛$T ...
- POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)
用01分数规划 + prime + 二分 竟然2950MS惊险的过了QAQ 前提是在TLE了好几次下过的 = = 题目意思:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一 ...
- 【usaco-Earthquake, 2001 Open】 0-1分数规划 & 最优比率生成树
题意:给定n个点m条边,一开始这些边全都是断的,要修一些边使得n个点全部联通.修完一共可以得到F元,修一条边有成本di和时间ti,要使得 得到的钱数 / 总时间 这个比值最大. 参考资料: 红线内的内 ...
- POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】
题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total ...
- [poj2976]Dropping tests(01分数规划,转化为二分解决或Dinkelbach算法)
题意:有n场考试,给出每场答对的题数a和这场一共有几道题b,求去掉k场考试后,公式.的最大值 解题关键:01分数规划,double类型二分的写法(poj崩溃,未提交) 或者r-l<=1e-3(右 ...
- POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9703 Accepted: 3299 ...
- ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)
[题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...
- POJ 2728 Desert King ★(01分数规划介绍 && 应用の最优比率生成树)
[题意]每条路径有一个 cost 和 dist,求图中 sigma(cost) / sigma(dist) 最小的生成树. 标准的最优比率生成树,楼教主当年开场随手1YES然后把别人带错方向的题Orz ...
随机推荐
- Ansible@一个高效的配置管理工具--Ansible configure management--翻译(七)
如无书面授权,请勿转载 Larger Projects Until now, we have been looking at single plays in one playbook file. Th ...
- Unity3D——加入剑痕效果(PocketRPG Trail插件)
首先非常感谢大家的支持,因为近期项目吃紧,所以更新的速度可能会有点慢!希望大家谅解,当然大家的支持是我最大的动力.我也会尽我所能写出更好的文章,当然因为本人是个新手并且工作的内容也不是unity3D. ...
- jquery 函数的定义
var ss_login = { ptjy : function(method) { CloseAlert(); if( getLocalData("ActivePTJYUser" ...
- m_Orchestrate learning system---十七、页面美观的关键是什么
m_Orchestrate learning system---十七.页面美观的关键是什么 一.总结 一句话总结:图片用好看的 1.项目板块化? 就是一个个模块,能复用的话很快的 页面由这一个个模块拼 ...
- [jzoj 4879] [NOIP2016提高A组集训第11场11.9] 少女觉 解题报告 (贪心)
题目链接: http://172.16.0.132/senior/#main/show/4879 题目: 在幽暗的地灵殿中,居住着一位少女,名为古明地觉.据说,从来没有人敢踏入过那座地灵殿,因为人们恐 ...
- maven关于pom文件配置详解(转载)
转载:http://www.cnblogs.com/hafiz <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...
- Linux Screen命令使程序远离断网影响
linux中强大的screen命令2008-12-02 21:53今天发现了一个“宝贝”,就是Linux的screen命令,对于远程登录来说,不仅提供了类似于nohup的功能,而且提供了我非常喜欢的“ ...
- application和javaBean练习
编写一个jsp程序,实现将用户信息保存在application对象的用户注册 package com.sp.test; public class User { private String usena ...
- 51nod 1096 距离之和最小 思维题,求中位数
题目: 在一条直线上,与两个点距离之和最小的点,是怎样的点? 很容易想到,所求的点在这两个已知点的中间,因为两点之间距离最短. 在一条直线上,与三个点距离之和最小的点,是怎样的点? 由两个点的规律,我 ...
- JOSN快速入门
1.JSON介绍 (1)JSON是一种与开发语言无关的,轻量级的数据格式,全称 JavaScript Object Notation,易于阅读和编写,语言解析和生产 (2)JSON数据类型表示 数据 ...