2016寒假训练——二分
2016-02-22 16:08
197 查看
来源:http://poj.org/problem?id=3104
POJ3104
用模拟会超时,所以考虑用二分节约时间
首先分析,实际上是每一次都是去烘干水量最大的,风干其他的,然后烘完再排序一下,重复这一操作,直到所有的都为1。当然,模拟显然是会超时的。所以我们这样考虑,我们这样考虑,如果对于一个时间t,我们的有一部分衣服就会自然风干,有一部分衣服需要自己来烘干,所以我们来二分列举时间。
这里有几个注意点(网上其他题解中提到的):
1.a/b向上取整有(a+b-1)/b;
2.注意k==1的情况
大概就是这样。。。
AC代码:(本人在VJ上做的这一题,不是在POJ,有人和我说可能有区别,这。。。就很尴尬了)
POJ3104
用模拟会超时,所以考虑用二分节约时间
首先分析,实际上是每一次都是去烘干水量最大的,风干其他的,然后烘完再排序一下,重复这一操作,直到所有的都为1。当然,模拟显然是会超时的。所以我们这样考虑,我们这样考虑,如果对于一个时间t,我们的有一部分衣服就会自然风干,有一部分衣服需要自己来烘干,所以我们来二分列举时间。
这里有几个注意点(网上其他题解中提到的):
1.a/b向上取整有(a+b-1)/b;
2.注意k==1的情况
大概就是这样。。。
AC代码:(本人在VJ上做的这一题,不是在POJ,有人和我说可能有区别,这。。。就很尴尬了)
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int Maxn=100100; int a[Maxn]; bool judge(int x,int n,int k){ int t=0; for(int i=0;i<n;i++){ if(a[i]>x){ t+=(a[i]-x+k-2)/(k-1); //这个地方就是用的那个技巧 //计算烘干a[i]的时间,并叠加 if(t>x)return false;//如果大于我假设的,就要判断为false } } return true; } int main(){ int n,k; long long ans=0,t; while(scanf("%d",&n)!=EOF){ ans=0; for(int i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&k); sort(a,a+n); if(k==1){ printf("%d\n",a[n-1]); continue; }//k==1的特殊处理 int l=1; int r=a[n-1]; while(l<=r){ int mid=l+(r-l)/2; int sum=0; if(judge(mid,n,k)){ ans=mid; r=mid-1; } else{ l=mid+1; } } printf("%lld",ans); } return 0; }欢迎各位看官大牛点评。橙子在这谢谢!
相关文章推荐
- android studio快捷键
- Jenkins 二:邮件配置
- iOS重绘机制drawRect
- Hduojo1059【01背包】
- 根据进程名批量杀死进程
- ClassLoader 详解及用途
- Activity四种启动模式
- iOS GCD 与 NSOperationQueue对比
- MP3帧时长为26ms的来历
- EAP测试方法
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- Bootstrap学习笔记
- ANDROID_MARS学习笔记_S05_003_传感器采样率及属性
- RecycleBin 分析
- 大数据分析师吴女士观点:大数据是回暖的计算机行业中绩增速最高的子行业
- codeforces 629 D. Babaei and Birthday Cake dp + 线段树
- linux字符驱动之异步通知按键驱动
- 关于intent中android.intent.action.USER_PRESENT的说明
- NSMutableAttributedString同一个label中显示不同的字体样式
- 【android 开 发 】 - Android studio 下 NDK Jni 开发 简单例子