【题解】CF1056F Write the Contest(三分+贪心+DP)
【题解】CF1056F Write the Contest(三分+贪心+DP)
最优化问题的三个解决方法都套在一个题里了,真牛逼
最优解应该是怎样的,一定存在一种最优解是先完成了耗时长的任务再干别的(不干白不干啊),所以我们按照耗时先排序。
假设你最优解是去事件\(e_1,e_2,e_3,e_4\),你可以在规定时间里干完,那么你如果按照耗时从大往小干也一定可以干完。
好像只能找到"按照耗时从大往小干"一种钦定方法使得所有方案可以归纳到这种情况
考虑最终耗时是怎样的:\(t\)表示练习用的时间
\]
我们转化一下思路,设\(dp(i,j)\)表示选择\(i\)个任务做并且将会获得收益\(j\)的的最小的\(\sum(\dfrac {10} 9)^i a_{h_i}\),这样的设置状态类似于那个Jury一题,【题解】Jury Compromise(链表+DP)。转移显然不讲了。
现在我们要使得\(f(t)=\dfrac {dp(i,j)} {s_0+Ct}+10t\)满足条件并且使得\(j\)最大,由于\(i,j\le O(n)\)所以直接\(n^2\)枚举即可,现在的问题就变成了最小化这个东西\(f(t)\),显然这个函数有单峰且最小(类双勾函数),所以直接三分即可。
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=1001;
long double dp[maxn][maxn];
const long double delta=(long double)9/10;
const long double eps=1e-5;
typedef pair < int , int > P;
P data[maxn];
// a c
#define f(x) (( (x)+dp[t][k]/(1+C*(x)) ))
long double mi[maxn];
int main(){
//freopen("gamemag.in","r",stdin);
//freopen("gamemag.out","w",stdout);
mi[0]=1;
for(register int t=1;t<maxn;++t) mi[t]=mi[t-1]/delta;
for(register int T00=qr();T00;--T00){
int n;
long double C,T;
cin>>n>>C>>T;
for(register int t=1;t<=n;++t)
data[t].first=qr(),data[t].second=qr();
sort(data+1,data+(int)n+1,[](const P&a,const P&b){return a>b;});
for(register int t=0;t<maxn;++t)
for(register int i=0;i<maxn;++i)
dp[t][i]=1e18;
dp[0][0]=0;
for(register int t=1;t<=n;++t){
for(register int i=t;i;--i){
for(register int k=data[t].second;k<=i*10;++k){
dp[i][k]=min(dp[i][k],dp[i-1][k-data[t].second]+data[t].first*mi[i]);
}
}
}
int ans=0;
for(register int t=1;t<=n;++t){
for(register int k=ans+1;k<=10*t;++k){
//cout<<dp[t][k]<<endl;
long double l=0,r=T,ll,rr;
do{
ll=l+(r-l)/3;
rr=r-(r-l)/3;
if(f(ll)<f(rr)) r=rr;
else l=ll;
}while(l+eps<r);
if(f(l)+10ll*t<T) ans=max(ans,k);
}
}
cout<<ans<<endl;
}
return 0;
}
【题解】CF1056F Write the Contest(三分+贪心+DP)的更多相关文章
- 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp
题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...
- 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp
题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...
- hdu 1257 最少拦截系统【贪心 || DP——LIS】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 贪心+DP【洛谷P4823】 [TJOI2013]拯救小矮人
P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...
- 【BZOJ-3174】拯救小矮人 贪心 + DP
3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 686 Solved: 357[Submit][Status ...
- BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP
BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...
- 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp
正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ...
- Codeforces Round #401 (Div. 2) A B C 水 贪心 dp
A. Shell Game time limit per test 0.5 seconds memory limit per test 256 megabytes input standard inp ...
- BZOJ_1229_[USACO2008 Nov]toy 玩具_三分+贪心
BZOJ_1229_[USACO2008 Nov]toy 玩具_三分+贪心 Description 玩具 [Chen Hu, 2006] Bessie的生日快到了, 她希望用D (1 <= D ...
随机推荐
- Celery后台任务
Celery 在程序运行过程中,经常会遇到一些耗时耗资源的任务,为了避免这些任务阻塞主进程的运行,我们会采用多线程或异步任务去处理.比如在Web中需要对新注册的用户发一封激活邮件来验证账户,而发邮件本 ...
- git 练习
删除文件 git rm test.txt git commit -m 'remove test.txt' 回复到最新版本 git checkout -- test.txt git checkout ...
- thinkphp3.2配置redis缓存和文件缓存
如果把一些常用但又不容易变的数据存缓存,而不是每次查数据库,这样能很大减轻数据库压力 最近由于项目需要,就尝试了一把redis,但是后面又用了tp3.2的文件缓存,直接进入主题: 在config.ph ...
- hdu 2225 The nearest fraction (数学题)
Problem - 2225 一道简单数学题,要求求出一个分母不超过m的最接近sqrt(n)的分数. 做法就是暴力枚举,注意中间过程不能用浮点数比较,误差要求比较高. 代码如下: #include & ...
- 使用react-tooltip实现鼠标悬浮显示框详细记录
前段时间遇到的一个需求,要求鼠标悬停显示使用描述, 用到了react-tooltip插件,今天写一个总结 先看效果(为了方便参考,用的是原始样式): 文档参考地址: https://www.npmjs ...
- vue+vant 购物车的全选和反选
https://blog.csdn.net/wjswangjinsheng/article/details/91392694
- H3C 虚拟模板方式配置PPP MP
- 理解java面向对象基础
1. 类和对象 一切皆对象,这可以说是面向对象的核心思想了. 类,就是具有相同性质对象的抽象. 而类的每一个具体的实例就是一个对象. 我们可以定义一个Person类,这个Person类就是所有的人的抽 ...
- gradle 生成 pom,引用mybatis-plus源代码到自己的工程中
一 前情概要 自己的maven工程使用mybatis-plus,然后想用热部署加载mapping文件.经过各种探索之后实现了,但是修改了xml文件后,就不断在控制台提示“mapper xxx is i ...
- python NameError: name 'raw_input' is not defined
错误:NameError: name 'raw_input' is not defined 原因出在raw_input ,python3.0版本后用input替换了raw_input 话说回来,学习p ...