这是一道二分答案算法题,洛谷标签中的贪心等完全用不到。
这道题的数据范围较大,所以保险起见,整型的数据我们都开成longlong
题意很好理解,这里就不做过多的分析了,直接看代码,后面有注释:
#include<bits/stdc++.h> using namespace std; long long n,k,l,a[1000010],maxn,ans; bool wood(long long x){ long long cnt=0; for(int i=1;i<=n;i++){ cnt+=a[i]/x; //看看每根木材按照设定长度可以截几段 } return cnt>=k;//判断此时设定的长度能否符合要求 } int main(){ cin>>n>>k; for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+n+1);//先排好序,方便比较(其实无所谓) long long l=0,r=1e9+1,mid;//l赋极小值,r赋极大值 while(l+1<r){ mid=(l+r)/2;//mid赋l与r的中间值,用以二分 if(wood(mid)){ //将mid带入函数,如果返回为真,说明符合条件,可以将长度增大 // cout<<l<<" "<<r<<endl; l=mid; ans=mid; } else { r=mid; //cout<<l<<" "<<r<<endl; } } printf("%lld",ans);//数据类型longlong的输出方式。 return 0; }
标签:洛谷,int,题解,木材,long,P2440 From: https://www.cnblogs.com/zhangqixun/p/17066688.html