POJ3104 Drying [二分]

简介:

题目不是非常难

大体思路:

题意:烘干机,给出一堆衣服的水分a[i],在不加烘干机情况下自己主动每一分钟降低1水分。每分钟能够变改衣服(i)到烘干机中,每分钟降低k水分,求最少须要多少时间。
题解:第一时间就想到使用二分枚据答案+验证这样的思路,只是这题还是有些陷阱须要注意。
1. 验证答案时,假设 a[i] <= mid。让它自然烘干就可以 。 假设a[i] > mid,那么烘干这件衣服能够分成两段时间:使用烘干机时间x1 + 自然烘干时间x2,那么能够列出等式:mid = x1 + x2; a[i] <= kx1+x2;于是得x1 >= (a[i] -mid)/(k-1);即得使用烘干机的最少时间x1
2.注意当k==1时。k-1 == 0。须要特殊处理。直接打出ans = maxV
3.注意当求left+right时,结果可能超出范围,正确的方法应该是left + (right - left)*0.5;



犯了一个非常2的错误,ceil(int/int),应该是ceil(int*1.0/int)

再次验证我的二分写法没错,哇哈哈哈

标准的 

while l<r

l=mid+1;

r=mid;

mid=l+(r-l)/2;

代码例如以下

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;

long long num[111111];
int main()
{
	//cout<<"here"<<endl;
	//cout<<ceil(3.4)<<endl;
	//cout<<ceil(4)<<endl;
	//cout<<"end"<<endl;
	long long n,k;
	long long maxn=0;
	while(scanf("%lld",&n)!=EOF)
	{
			for(long long i=1;i<=n;i++)
			{
				scanf("%lld",&num[i]);
				maxn=max(maxn,num[i]);
			}
			sort(num+1,num+1+n);
			scanf("%lld",&k);
			if(k==1)
			{
				printf("%lld\n",maxn);
				continue;
			}
			long long l=1,r=maxn,mid=(r+l)/2;
			long long ans=0;
			while(l<r)
			{
				//mid=(l+r)/2;
				long long sum=0;
				for(long long i=1;i<=n;i++)
				{
					if(num[i]>mid)
						sum+=ceil((num[i]-mid)*1.0/(k-1));
				}
				if(sum>mid)
					l=mid+1;
				else if(sum<=mid)
				{
					r=mid;
				}
				mid=(l+r)/2;
			}
			printf("%lld\n",mid);
	}
}











本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5116529.html,如需转载请自行联系原作者

相关文章
|
人机交互
POJ-2524,Ubiquitous Religions(并查集模板题)
POJ-2524,Ubiquitous Religions(并查集模板题)
|
机器学习/深度学习
棋盘问题 POJ 1321
总时间限制:  1000ms 内存限制:  65536kB 描述 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
1143 0
|
人工智能 网络架构
|
机器学习/深度学习
A-POJ-1321 棋盘问题
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。
919 0
|
人工智能
POJ 2370 Democracy in danger(简单贪心)
Democracy in danger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3388   Accepted: 2508 Description In one of the...
934 0
poj supermaket (贪心)
http://poj.org/problem?id=1456 #include #include #include using namespace std; struct nod { int a; int d; }; bool cmp(nod x,nod y) { return x.
673 0
|
人工智能 C++
|
机器学习/深度学习
|
文件存储
poj 2229 Sumsets 【动态规划】
点击打开题目 Sumsets Time Limit: 2000MS   Memory Limit: 200000K Total Submissions: 13291   Accepted: 5324 Description Far...
907 0