Codeforces 994F Compute Power 二分+DP
题意:给n个任务 每个任务有两个值\(a,b\) 现有许多机器 每台最多可以执行两次任务 若存在第二次任务则满足\(a_{second}<a_{first}\) 定义代价\(val = \frac { \sum_{i \in S } a[i]} { \sum_{i \in S} b[i] }\) 其中\(S\)为当做第一次来执行的任务的集合 求\(val\)的最小值
\(n \leq 60,a_i \leq 10^8,b_i \leq 100\)
很容易想到二分最小值并且联想到经典的\(01\)分数规划 即
\(\frac {\sum_{i=1}^{n}a[i]}{\sum_{i=1}^{n}b[i]} \leq x\)
\({\sum_{i=1}^{n}a[i]} \leq x \times {\sum_{i=1}^{n}b[i]}\)
\({\sum_{i=1}^{n}a[i]}-x \times {\sum_{i=1}^{n}b[i]} \leq 0\)
\({\sum_{i=1}^{n} (a[i]-x \times b[i]) \leq 0}\)
顺着这个思路 我们来设计\(dp\)方程
先将任务按\(a\)降序排序
\(f[i][j][k]\)表示做到第\(i\)个有\(j\)个大于\(a_i\)的任务是当做第一次来做且没有被安排第二次有\(k\)个等于\(a_i\)的任务是当做第一次来做且没有被安排第二次
转移式为
\(f[i][j][k]=min(f[i+1][j-1][k],f[i+1][j+1][k]+a_i-x \times b_i )(a_i=a_{i+1})\)
\(f[i][j][k]=min(f[i+1][j+k-1][0],f[i+1][j+k-1][0]+a_i-x \times b_i) (a_i>a_{i+1})\)
\(dp\)之后只需要判定\(f[0][0][0] \leq 0\)是否满足来二分就好了
有个坑点是题目要求输出\(ceil(ans \times 1000)\) 我用\(google\)翻译出来却是把\(ans \times 1000\)四舍五入 以后还是读英文题面好了
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define ll long long
#define cl(x) memset(x,0,sizeof x)
#ifdef Poi
#define bug(x) cout<<(#x)<<" "<<(x)<<endl
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define bug(x)
#define debug(...)
#endif
const int INF = 0x7fffffff;
const int N=55;
inline int read(){
int x=0,rev=0,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')rev=1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return rev?-x:x;
}
struct data{
double a,b;
}t[N];
double X,f[N][N][N];
bool vis[N][N][N];
int n;
ll ans;
bool cmp(data i,data j){
return i.a>j.a;
}
double dfs(int pos,int d,int g){
if(pos==n) return 0;
if(vis[pos][d][g]) return f[pos][d][g];
vis[pos][d][g]=1;
double mn=INF;
if(pos<n-1&&t[pos].a==t[pos+1].a) {
if(d) mn=min(mn,dfs(pos+1,d-1,g));
mn=min(mn,dfs(pos+1,d,g+1)+t[pos].a-X*t[pos].b);
}
else if(t[pos].a!=t[pos+1].a||pos==n-1){
if(d) mn=min(mn,dfs(pos+1,d+g-1,0));
mn=min(mn,dfs(pos+1,d+g+1,0)+t[pos].a-X*t[pos].b);
}
return f[pos][d][g]=mn;
}
bool judge(double k){
X=k,cl(vis),cl(f);
return dfs(0,0,0)<=0;
}
int main(){
#ifdef Poi
freopen("in.txt","r",stdin);
#endif
n=read();
for(int i=0;i<n;i++) t[i].a=read();
// bug(t[n-1].a);
for(int i=0;i<n;i++) t[i].b=read();
if(t[0].a==99999991) {
// for(int i=0;i<n;i++) cout<<t[i].b<<endl;
}
sort(t,t+n,cmp);
double l=0,r=1e8;
for(int T=1;T<=100;T++){
double mid=(l+r)/2.0;
// bug(mid);
if(judge(mid)) r=mid;
else l=mid;
}
// bug(l);
ans=(ceil)(l*1000);
// printf("%.6lf\n",l);
cout<<ans<<endl;
}
Codeforces 994F Compute Power 二分+DP的更多相关文章
- Codeforces 660C - Hard Process - [二分+DP]
题目链接:http://codeforces.com/problemset/problem/660/C 题意: 给你一个长度为 $n$ 的 $01$ 串 $a$,记 $f(a)$ 表示其中最长的一段连 ...
- codeforces 808 E. Selling Souvenirs (dp+二分+思维)
题目链接:http://codeforces.com/contest/808/problem/E 题意:最多有100000个物品最大能放下300000的背包,每个物品都有权值和重量,为能够带的最大权值 ...
- 「学习笔记」wqs二分/dp凸优化
[学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...
- 二分+DP HDU 3433 A Task Process
HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- hdu 3433 A Task Process 二分+dp
A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 2018.10.24 NOIP模拟 小 C 的数组(二分+dp)
传送门 考试自己yyyyyy的乱搞的没过大样例二分+dp二分+dp二分+dp过了606060把我自己都吓到了! 这么说来乱搞跟被卡常的正解比只少101010分? 那我考场不打其他暴力想正解血亏啊. 正 ...
- 【bzoj1044】[HAOI2008]木棍分割 二分+dp
题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且 ...
- Luogu P2511 [HAOI2008]木棍分割 二分+DP
思路:二分+DP 提交:3次 错因:二分写萎了,$cnt$记录段数但没有初始化成$1$,$m$切的次数没有$+1$ 思路: 先二分答案,不提: 然后有个很$naive$的$DP$: 设$f[i][j] ...
- [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)
[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...
随机推荐
- C#删除WebBrowser控件Session
转载:http://www.hackdig.com/?02/hack-1464.htm 因为要搞一个类似帐号多开的小辅助,但是很坑爹的发现,在一个WebBrowser中,就算重新登录,显示的仍然是上一 ...
- Ex 6_3 修建酒店所获得的利润..._第五次作业
假设profit[i]为在前i个位置修建酒店所获得的最大利润,当i=0时,profit[0]=0.当i>0时,若j为上一个满足m[i]-m[j]k的位置.若profit[i-1]>prof ...
- Expm 8_1 区间划分问题
[问题描述] 给定一组报告,其中的每个报告设置了一个开始时间si和结束时间fi.设计与实现一个算法,对这组报告分配最少数量的教室,使得这些报告能无冲突的举行. package org.xiu68. ...
- 随机森林学习-2-sklearn
# -*- coding: utf-8 -*- """ RandomForestClassifier skleran的9个模型在3份数据上的使用. 1. 知识点: skl ...
- 生活工作必备之SMART原则
所谓SMART原则,即: 1. 目标必须是具体的(Specific) 2. 目标必须是可以衡量的(Measurable) 3. 目标必须是可以达到的(Attainable) 4. 目标必须和主要目标具 ...
- vue系列之webstrom开发vue,无法热更新
用vue-cli构建了项目之后在webstorm开发,用npm run dev跑本地服务,经常修改之后在浏览器刷新没反应,偶尔才会有刷新,需要重新跑一遍npm run dev才会更新,这是怎么回事呢? ...
- Chrome浏览器JSON格式化插件
经常我们使用浏览器调试某个接口,返回的结果看起来很乱如下 我们使用JSON-handle来进行格式化 安装 插件下载地址 插件下载后,在浏览器输入:chrome://extensions/ 将下载后的 ...
- 步步为营-47-分页显示的SQL语句
说明:分页显示在实际业务中经常需要用到,其SQL语句分两种 1:分页显示SQL语句 --方法一:跳过多少行,选中多少行 --每页n条,选择第m页--n= m= --)*n 主键 from 表); se ...
- JS高级 - 面向对象3(面向过程改写面向对象)
改写: 1.前提:所有东西都在 onload 里 2.改写:不能有函数嵌套,可以有全局变量 onload --> 构造函数 全局变量 --> 属性 函数 --> 方法 4.改错: t ...
- UOJ Round #1 题解
题解: 质量不错的一套题目啊..(题解也很不错啊) t1: 首先暴力显然有20分,把ai相同的缩在一起就有40分了 然后会发现由于原来的式子有个%很不方便处理 so计数题嘛 考虑一下容斥 最终步数=初 ...