Codeforces 题目传送门 & 洛谷题目传送门

原来 jxd 作业里也有我会做的题 i 了 i 了

首先这种题目的套路就是先考虑对于一个固定的 \(c\),怎样求出得分最高的策略,而类似于这样的问题都考虑贪心求解,手玩几组数据就能发现最优方案是将所有题目按照 \(\dfrac{p_i}{t_i}\) 从大到小排列。简单证明一下,考虑按照 P4437 排列的套路,假设有两道题 \(i,j\) 满足 \(\dfrac{p_i}{t_i}>\dfrac{p_j}{t_j}\),那么将 \(i\) 放在 \(j\) 前面的得分为 \(W_1=p_i(1-\dfrac{ct_i}{T})+p_j(1-\dfrac{c(t_i+t_j)}{T})\),将 \(i\) 放在 \(j\) 后面的得分为 \(W_2=p_j(1-\dfrac{ct_j}{T})+p_i(1-\dfrac{c(t_i+t_j)}{T})\),做差可得 \(\Delta=W_1-W_2=\dfrac{c(p_it_j-p_jt_i)}{T}\),而由 \(\dfrac{p_i}{t_i}>\dfrac{p_j}{t_j}\) 知 \(p_it_j-p_jt_i>0\),故 \(\Delta>0\),也就是说将 \(i\) 放在 \(j\) 前面最优,至于 \(\dfrac{p_i}{t_i}\) 相同的 \(i\),一定有 \(\Delta=0\),也就是说 \(\dfrac{p_i}{t_i}\) 相同的 \(i\) 可以随意交换位置。据说这套路还有个专门名字叫什么 Exchange arguments?不过名字啥的不重要辣,MO 里一般叫它调整法,反正这东西在 OI 和 MO 里都挺有用的就对了(

接下来考虑怎样求答案。首先这个 \(c\) 满足单调性,故考虑二分答案,这是题目中疯狂暗示的,再想不到就有些 sb 了罢(别打我)。考虑检验某个 \(c\) 是否合法,我们显然可以确定每道题可能被完成的最靠前的时间,以及每道题可能被完成的最靠后的时间。具体来说,我们将 \((p_i,t_i)\) 按从大到小顺序排序,记 \(sum_i\) 为对于排好序的 \(t_i\),\(\sum\limits_{j=1}^it_j\) 的值。考虑对于一段极长的区间 \([l,r]\) 满足 \(\forall x,y\in [l,r]\) 都有 \(\dfrac{p_x}{t_x}=\dfrac{p_y}{t_y}\),那么显然对于 \(i\in [l,r]\),问题 \(i\) 可能被完成的最靠前的时间为 \(sum_{l-1}+t_i\),最靠后的时间为 \(sum_r\)。因此我们只需检验是否 \(\exist i,j\) 满足 \(p_i>p_j\),完成 \(i\) 最少可能的得分 \(<\) 完成 \(j\) 最大可能的得分,这个可以通过再将所有题目按 \(p_i\) 排序并用 two pointers 维护 \(mx=\max\limits_{p_j<p_i}p_j(1-\dfrac{c·mxt_j}{T})\),其中 \(mxt_j\) 即为上文中所说的问题 \(i\) 可能的最靠后的完成时间。并与 \(i\) 在可能的最靠前的完成时间的得分比较即可。

时间复杂度 \(\mathcal O(n\log n)\)。

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define ppb pop_back
#define mp make_pair
template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;}
template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;}
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned int u32;
typedef unsigned long long u64;
namespace fastio{
#define FILE_SIZE 1<<23
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}
const int MAXN=1.5e5;
const double EPS=1e-9;
int n;ll T,sum[MAXN+5];
struct data{ll p,t,mn,mx;} a[MAXN+5];
bool cmp1(data lhs,data rhs){return lhs.p*rhs.t>rhs.p*lhs.t;}
bool cmp2(data lhs,data rhs){return lhs.p<rhs.p;}
bool check(double x){
double mx=0;
for(int i=1,j=1;i<=n;i++){
while(a[j].p!=a[i].p) chkmax(mx,1.0*a[j].p*(1-x*a[j].mn/T)),j++;
if(1.0*a[i].p*(1-x*a[i].mx/T)<mx) return 0;
} return 1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i].p);
for(int i=1;i<=n;i++) scanf("%lld",&a[i].t),T+=a[i].t;
sort(a+1,a+n+1,cmp1);
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i].t;
for(int l=1,r;l<=n;l=r+1){
r=l;while(r<n&&a[r].p*a[r+1].t==a[r].t*a[r+1].p) r++;
for(int i=l;i<=r;i++) a[i].mx=sum[r],a[i].mn=sum[l-1]+a[i].t;
} sort(a+1,a+n+1,cmp2);
double l=0,r=1.0,x=-114514.1919810;
while(fabs(r-l)>EPS){
double mid=(l+r)/2.0;
if(check(mid)) x=l=mid;
else r=mid;
} printf("%.10lf\n",x);
return 0;
}

Codeforces 639E - Bear and Paradox(二分+贪心)的更多相关文章

  1. codeforces 613B B. Skills(枚举+二分+贪心)

    题目链接: B. Skills time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  2. CodeForces 377B---Preparing for the Contest(二分+贪心)

    C - Preparing for the Contest Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d ...

  3. Codeforces C Match Points(二分贪心)

    题目描述: Match Points time limit per test 2 seconds memory limit per test 256 mega bytes input standard ...

  4. codeforces 1251D Salary Changing (二分+贪心)

    (点击此处查看原题) 题意分析 一共有s元钱,要用这些钱给n个人发工资,发给每个人的工资si有最少和最多限制 si ∈[li,ri],在发给n个人的总工资小于s的情况下,要求发给n个人中的工资的中位数 ...

  5. Codeforces Round #262 (Div. 2) 二分+贪心

    题目链接 B Little Dima and Equation 题意:给a, b,c 给一个公式,s(x)为x的各个位上的数字和,求有多少个x. 分析:直接枚举x肯定超时,会发现s(x)范围只有只有1 ...

  6. CodeForces 551C - GukiZ hates Boxes - [二分+贪心]

    题目链接:http://codeforces.com/problemset/problem/551/C time limit per test 2 seconds memory limit per t ...

  7. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  8. Codeforces 680D Bear and Tower of Cubes 贪心 DFS

    链接 Codeforces 680D Bear and Tower of Cubes 题意 求一个不超过 \(m\) 的最大体积 \(X\), 每次选一个最大的 \(x\) 使得 \(x^3\) 不超 ...

  9. 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心

    /** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...

随机推荐

  1. 整数划分为k份

    题目 将整数n分成k份,且每份不能为空,任意两个方案不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. 输入 ...

  2. nsq - 一条消息的生命周期(一)

    经过前面几篇的学习,相信大家对nsq已经有了一个大概的了解,我在写这篇文章的时候也看了很多其他人写的教程,发现大家对于分析系统每个点写的很不错,但是都很少有整体串起来一起走一遍,所以,我打算分成2-3 ...

  3. 【Deeplearning.ai 】吴恩达深度学习笔记及课后作业目录

    吴恩达深度学习课程的课堂笔记以及课后作业 代码下载:https://github.com/douzujun/Deep-Learning-Coursera 吴恩达推荐笔记:https://mp.weix ...

  4. 面试题系列:new String("abc")创建了几个对象

    new String("abc")创建了几个对象 面试官考察点猜想 这种问题,考察你对JVM的理解程度.涉及到常量池.对象内存分配等问题. 涉及背景知识详解 在分析这个问题之前,我 ...

  5. Scrum Meeting 1补充会议

    日期:2021年04月24日 会议主要内容概述: 本次会议于11:30举行,对项目架构做出了重要调整,并根据该调整修改了第1次例会报告中后两日计划完成的工作部分. 一.架构调整 会上讨论了用户模块相关 ...

  6. 对mongo文档的增删改操作

    在mongo db 中增加.删除.修改文档有好多方法,这里简单记录一下我所知道的一些方法. 前置条件: 1.创建study数据库  use study; 2.创建persons集合,当第一次向pers ...

  7. 零基础小白要如何跟好的学习嵌入式Linux(转)

    作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学 ...

  8. Flink计算pv和uv的通用方法

    PV(访问量):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次. UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客.00:00-24:00 ...

  9. RocketMQ源码详解 | Broker篇 · 其三:CommitLog、索引、消费队列

    概述 上一章中,已经介绍了 Broker 的文件系统的各个层次与部分细节,本章将继续了解在逻辑存储层的三个文件 CommitLog.IndexFile.ConsumerQueue 的一些细节.文章最后 ...

  10. vue强制组件重新渲染

    有时候,依赖 Vue 响应方式来更新数据是不够的,相反,我们需要手动重新渲染组件来更新数据.或者,我们可能只想抛开当前的DOM,重新开始.那么,如何让Vue以正确的方式重新呈现组件呢? 强制 Vue ...