每日一题 华华给月月准备礼物
华华给月月准备礼物
http://www.nowcoder.com/questionTerminal/9963334321e64e61a397b262708e4f65
可能是对于小木棍这种题目过于熟悉,把我以前在洛谷P2440上的代码搬来了,ac了
讲讲思路:二分的基础题目
二分最重要的就是check函数 (这仅仅只是可行解)
当然可行解并不一定是最优解所以我们还需要往最优解靠继续二分
#include <bits/stdc++.h>
using namespace std;
#define int long long
const signed maxn=1e6+7;
int a[maxn];
int n,m;
bool check(int x)
{
int cnt=0;
for (int i=1;i<=n;++i)
{
cnt+=a[i]/x;统计总共可以得到多少根
if (cnt>=m)///所得数大于预估
return 1;//说明这是可行解
}
return 0;
}
signed main()
{
scanf("%lld%lld",&n,&m);
int mmaxn=0;
for (int i=1;i<=n;++i)
{
scanf("%lld",a+i);
mmaxn=max(mmaxn,a[i]);
}
int l=1;
int r=mmaxn;///从最大的那一段开始二分
while (l<=r)
{
int mid=(l+r)>>1;
if (check(mid))
l=mid+1;
else
r=mid-1;///比预估少 所以区间向左移
}
printf("%lld",l-1);///最后满足的是l=mid+1 此时的mid就是答案因为check的是mid
return 0;
}
查看19道真题和解析