noip模拟【tea】
tea
【题目描述】有n个容量为V的瓶子,第i个瓶子中装着a[i]个单位的tea,使所有瓶子内的tea在不 超过其容量的前提下,非空的瓶子最少。在一个单位时间内,可以同时将多个瓶子中的tea倒入另外多个瓶子中但每个瓶只能倒出或倒入一个单位的tea,在使用最少瓶子的情况下,所消耗的时间最少。求出需要的瓶子数和最少时间。
这题反正也找不到地方交,那就不写什么输入输出了。数据范围的上限是1e5。
【题解思路】乍一眼感觉可做性挺强的。
- 明显要贪心。第一问直接用饮料的总容量判一下就好,记答案为m。第二问贪心选择最多tea的瓶子和最少tea的瓶子装在一起,这样可保证每个单位时间工作量最大,很明显需要排序成容量递减的瓶子。
- 脑中模拟一下这个过程,第一个单位时间内,将容量最多的和容量最少的倒一起,容量第二多的与容量第二少的到在一起……然后一轮下来之后,将倒满了的瓶子不算,继续重复上述过程。
- 火眼金睛看出这道题有没有什么端倪?这样一直首尾首尾倒下去,瓶子数会慢慢减少的吧,满瓶数量会越来越多,单调性?!我会二分。以编号为m的瓶子为下界,用k表示最多需要的单位时间内可完成任务。诶,这个k是不是有什么性质啊?我们已知最后完成任务需要m个瓶子,那么有:
(1) 倒完所需的时间一定要大于第m+1个瓶子的容量。
证明:因为第a[m+1]是m+1~n的瓶子里装tea最多的,每个单位时间只能从m+1的瓶中倒出一个单位的水,则至少需要a[m+1]的时间。
(2) 倒完所需时间还一定都小于V(可以容纳的最大容积)。
证明:设m+1~n的瓶中tea的总和为V_max,下面证明V_max< V。所有的tea之和为(V*(m-1),V*m], (sum)a[1~m] > m*a[m+1] >= m*k (sum)a[m+1~n] < (V-k)*m,即V_max = (V-k)*m >0,所以 V > k 。
此为理性理解,可能感性理解灰常容易,但是ve此刻只会理性分析。陷入其中无法自拔
4. 借此二分,下界为a[m+1],上界为V。啪啪啪,正解就出来了,无再多细节之说。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + ;
int n,V,minn,l,r;
long long sum = ;
int a[maxn];
inline int read(){
int x=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
bool v(int x){
sum = ;
for(int i = ;i <= minn; ++i) sum += min(V-a[i],x);
for(int i = minn+;i <= n; ++i) sum -= a[i];
return sum >= ;
}
bool cmp(int x,int y) {return x > y;}
int main(){
freopen("tea.in","r",stdin);
freopen("tea.out","w",stdout);
n = read(),V = read();
for(int i = ;i <= n; ++i){
a[i] = read();
sum += a[i];
}
if(!(sum%V)) minn = sum/V;
else minn = sum/V + ;
sort(a+,a+n+,cmp);
if(minn < n) l = a[minn+];
else l = ;
int r = V;
while(l + < r){
int m = l+r>>;
if(v(m)) r = m;
else l = m;
}
for(int i = l;i <= r; ++i)
if(v(i)) {
printf("%d %d\n",minn,i);
return ;
}
return ;
}
这个题花了很长时间,因为题看错了 + sb错误没查出来。下面列出这题的sb错误以警示自己。
1.
if(!(sum%V)) minn = sum/V;
等价于sum%V==0,但不是 !sum%V,还有这句话可以写成:
minn = (sum + V -1)/V;
2. 循环的起始因为变量长得太像写错了,但这不是理由,以后要注意了。
3. 变量如果设一样的表不同意思一定要搞清楚什么时候变化之类的,切忌混淆。
noip模拟【tea】的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
随机推荐
- hbase-java-api001
package api; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfig ...
- 删除(unfork)github中某个库(repository)
1.头像->your profile 2.点击某个想要删除的库,出现界面: 3.点击setting,鼠标滚动页面至末尾,出现页面: 4.点击delete this repository: OK!
- uvalive 3126 Taxi Cab Scheme
题意: 有m个人要坐出租车,每个人给出出发时间,出发地点和目的地(以二维坐标表示),两个地点之间所花的时间计算方式是两点之间的哈密顿距离.现在需要排遣车出去,一辆车每次只能装一个人,如果一辆车在装完一 ...
- 20155228 实验五 Android开发基础
20155228 实验五 Android开发基础 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验要求 1.没有Linux基础的同学建议先学习< ...
- noip200605能量项链
题解: 状态转移方程为:dp[i][j] = max{dp[i][k] + dp[k+1][j] + a[i]*a[k+1]*a[j+1]}, k=i, ..., j-1, i和j都从1开始.dp[i ...
- 【2017-2-21】C#分支语句,分支嵌套,变量的作用域
分支语句 句式:if else(必须是if开头,可以是else if或者else结束,也可以直接结束) if(bool型比较表达式) { 如果上面的条件成立,则执行这里面的代码 } else if(b ...
- STL容器vector应用注意事项
[1]提前分配足够空间以免不必要的重新分配和复制代价 关于vector容器重新分配和复制及析构释放的代价,请参见随笔<STL容器之vector>. 应用示例对比代码如下: #include ...
- SLAM学习笔记 - ORB_SLAM2源码运行及分析
参考资料: DBow2的理解 单目跑TUM数据集的运行和函数调用过程 跑数据集不需要ros和相机标定,进入ORB_SLAM目录,执行以下命令: ./Examples/Monocluar/mono_tu ...
- arm cortex-m0plus源码学习(二)AMBA3.0_ AHBLite
1. AMBA总线概述 AMBA2.0 以上版本都是基于单沿时钟.单向信号线的协议[1]. 现在市场上大部分的基于 AMBA 架构的 SoC 产品, 系统总线采用 AHB, 外部总线采用 APB.系统 ...
- Java8函数式编程探秘
引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下所示: public ...