[USACO07JAN]Cow School
一开始还以为是一道分数规划,后来发现自己看错题了,
然后成功入坑
题目是要求先按照$t_i/p_i$从小到大排序,然后删除前$d$个后求出剩下的$\frac{\sum^{n-d+1}_{i=1}t_i}{\sum^{n-d+1}_{i=1}p_i}$,如果当前的删除方法不是最优的(即能删除其它$d$个数使原式的值变大的话),则输出这个$d$
首先排序自不必说,排完序之后基础的式子的值也就求出来了
那么问题就在于如何判断当前的删除方法是不是最优的
为了方便我们将数据从大到小排序
我们假设当前取了前$k$个最大的
并设$T=t_1+t_2+\cdots+t_k,P=p_1+p_2+\cdots+p_k$
那么题目就是求是否存在$i,j$,满足$\frac{T-t_i+t_j}{P-p_i+p_j}>\frac{T}{P}$(其中$i\in \lbrace1,2,\cdots,k \rbrace,j\notin \lbrace1,2,\cdots,k \rbrace$)
将式子变形得$P*t_i-T*p_i<P*t_j-T*t_i$
所以我们只要找出$P*t_i-T*p_i$的$min$,以及$P*t_j-T*p_j$的$max$
这时我们再来算一算时间复杂度
我们在枚举前$k$个最大的数时需要$O(n)$的时间,
因此我们在处理最大值与最小值时只能用$O(logn)$的时间复杂度
但由于我们的$与T_i与P_i$是已经排好序的,所以我们可以用二分来处理这个最大值与最小值
感觉洛谷上这题给黑题是不是太高看了(逃
- #include<iostream>
- #include<string>
- #include<string.h>
- #include<stdio.h>
- #include<algorithm>
- #include<vector>
- #include<queue>
- #include<map>
- using namespace std;
- const long long inf=(long long)1e18;
- struct node{
- long long t,p;
- }a[],b[];
- int n,ans[];
- long long mind[],maxd[];
- bool cmp(node x,node y)
- {
- return x.t*y.p>x.p*y.t;
- }
- void getmin(int l,int r,int pl,int pr)
- {
- int i,mid=(l+r)>>,pos;
- for (i=pl;i<=mid&&i<=pr;i++)
- {
- long long tmp=a[i].t*b[mid].p-a[i].p*b[mid].t;
- if (tmp<mind[mid]) {mind[mid]=tmp;pos=i;}
- }
- if (l<mid) getmin(l,mid-,pl,pos);
- if (r>mid) getmin(mid+,r,pos,pr);
- }
- void getmax(int l,int r,int pl,int pr)
- {
- int i,pos,mid=(l+r)>>;
- for (i=pr;i>mid&&i>=pl;i--)
- {
- long long tmp=a[i].t*b[mid].p-a[i].p*b[mid].t;
- if (tmp>maxd[mid]) {maxd[mid]=tmp;pos=i;}
- }
- if (l<mid) getmax(l,mid-,pl,pos);
- if (r>mid) getmax(mid+,r,pos,pr);
- }
- int main()
- {
- scanf("%d",&n);
- int i;
- for (i=;i<=n;i++) scanf("%lld%lld",&a[i].t,&a[i].p);
- sort(a+,a++n,cmp);
- b[].t=;b[].p=;
- for (i=;i<=n;i++)
- {
- b[i].t=b[i-].t+a[i].t;
- b[i].p=b[i-].p+a[i].p;
- }
- for (i=;i<=n;i++) {mind[i]=inf;maxd[i]=-inf;}
- getmin(,n-,,n);getmax(,n-,,n);
- int pos=;
- for (i=;i<n;i++) if (mind[i]<maxd[i]) ans[++pos]=n-i;
- printf("%d\n",pos);
- for (i=pos;i>=;i--) printf("%d\n",ans[i]);
- return ;
- }
[USACO07JAN]Cow School的更多相关文章
- P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)
P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...
- bzoj1635 / P2879 [USACO07JAN]区间统计Tallest Cow
P2879 [USACO07JAN]区间统计Tallest Cow 差分 对于每个限制$(l,r)$,我们建立一个差分数组$a[i]$ 使$a[l+1]--,a[r]++$,表示$(l,r)$区间内的 ...
- 洛谷P2879 [USACO07JAN]区间统计Tallest Cow
To 洛谷.2879 区间统计 题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. ...
- [Luogu2879][USACO07JAN]区间统计Tallest Cow
题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a p ...
- P2877 [USACO07JAN]牛校Cow School
传送门 $01$规划 $01$规划优质讲解:传送门 考虑先将每一科按 $t/p$ 从小到大排序,枚举每一个 $D$(删除的考试数量) 显然一开始的成绩是 $\frac{\sum_{i=d+1}^nt[ ...
- 洛谷 P2879 [USACO07JAN]区间统计Tallest Cow
传送门 题目大意: n头牛,其中最高身高为h,给出r对关系(x,y) 表示x能看到y,当且仅当y>=x并且x和y中间的牛都比 他们矮的时候,求每头牛的最高身高. 题解:贪心+差分 将每头牛一开始 ...
- 题解 P2879 【[USACO07JAN]区间统计Tallest Cow】
题目链接: https://www.luogu.org/problemnew/show/P2879 思路: 先不管最大高度,我们读入一对x,y.说明,x+1~y-1之间牛的身高都小于x,y. 然后不妨 ...
- [USACO07JAN]区间统计Tallest Cow
前缀和 sum[i]表示前i个数的和 每次读入a[i]的时候 sum[i] = sum[i - 1] + a[i]; 查询l ~ r区间的和: sum[r] - sum[l - 1] 差分 即前缀和的 ...
- 【洛谷】P2880 [USACO07JAN]平衡的阵容Balanced Lineup(st表)
题目背景 题目描述: 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连 ...
随机推荐
- Mike and strings CodeForces - 798B (又水又坑)
题目链接 题意:英语很简单,自己取读吧. 思路: 既然n和i字符串的长度都很小,最大才50,那么就是只要能出答案就任意暴力瞎搞. 本人本着暴力瞎搞的初衷,写了又臭又长的200多行(代码框架占了50行) ...
- fun = [lambda x: x*i for i in range(4)] 本质解析/原理,LEGB规则 闭包原理
命名空间,闭包原理,参考点击本文 一.问题描述 fun = [lambda x: x*i for i in range(4)] for item in fun: print(item(1)) 上述式子 ...
- Django 2.0 学习
Django django是基于MTV结构的WEB框架 Model 数据库操作 Template 模版文件 View 业务处理 在Python中安装django 2.0 1 直接安装 pip inst ...
- 《梦断代码》Scott Rosenberg著(一)
两打程序员,3年时间,4732个bug,只为打造超卓软件. --序 在我们平时看到的大部分书籍只是讲技术和理论,但我们其实并不知道在真实的软件开发过程中,这些技术和理论究竟是被什么样的人如何去使用, ...
- PHP之常用设计模式
在日常开放中,经常会用到一些设计模式,进行我们代码的优化处理,一个很好的设计思想 1) 工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 ...
- 导出数据之CSV
平常开发中,常见的需求就是导出数据为Excel,CSV格式的表格.所以,在此记录一下导出CSV数据的小方法 $fileName = 'demo.csv'; $data = [ ['id'=>1, ...
- PHP Lumen Call to a member function connection() on null 报错
(1/1) Error Call to a member function connection() on nullin Model.php line 1201at Model::resolveCon ...
- 【学亮开讲】Oracle存储过程教学笔记(一)20181115
--创建业主序列起始值为11 ; --不带传出参数的存储过程 create or replace procedure pro_owners_add ( v_name varchar2,--名称 v_a ...
- 下拉框插件select2的使用
它的优点有: 样式还算好看,支持多选,支持索搜 下面来介绍下select2的用法 1.最简单的用法 只需要加载css和js即可使用 <select name="" id=&q ...
- 创建虚拟目录失败,必须为服务器名称指定“localhost”
关于微信开发过程,远程调试后,再次打开vs出现项目加载失败的解决办法! 第一步: 第二步:打开编辑的页面,把下图这部分直接注释掉 ok了,再加载一次,就好了!