时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

有 n 棵树,初始时每棵树的高度为 Hi,第 i 棵树每月都会长高 Ai。现在有个木料长度总量为 S 的订单,客户要求每块木料的长度不能小于L,而且木料必须是整棵树(即不能为树的一部分)。现在问你最少需要等多少个月才能满足订单。

输入描述:

第一行 3 个用空格隔开的非负整数 n,S,L,表示树的数量、订单总量和单块木料长度限制。
第二行 n 个用空格隔开的非负整数,依次为 H1,H2,... ,Hn。
第三行 n 个用空格隔开的非负整数,依次为 A1,A2,... ,An。

输出描述:

输出一行一个整数表示答案。
示例1

输入

3 74 51
2 5 2
2 7 9

输出

7

说明

对于样例,在六个月后,各棵树的高度分别为 14,47,56,此时无法完成订单。
在七个月后,各棵树的高度分别为 16,54,65,此时可以砍下第 2 和第 3 棵树完成订单了。

备注:

1≤n≤200000,1≤S,L≤1018,1≤Hi,Ai≤109

【分析】:二分答案。上界不能直接选择1e18,会爆long long。根据一棵树能完成需求的时间最小值不断降低时间。
【代码】:
#include <bits/stdc++.h>
#define LL long long
#define maxn 200005 using namespace std;
LL a[maxn],h[maxn],S,L,mx;
int n; bool check(LL day)
{
LL ans=;
LL now;
for(int i=;i<=n;i++)
{
now = a[i]*day+h[i];//x是天数,a是步长(增量)一个一个的增,增完下一个
if(now>=L) ans+=now;
if(ans>=S) return true;
}
return false;
}
int main()
{
cin>>n>>S>>L;
for(int i=;i<=n;i++) cin>>h[i];
for(int i=;i<=n;i++) cin>>a[i],mx=max(mx,max(L,S)/a[i]);
LL l=,r=mx,ans=;
while(l<=r)
{
LL mid=(l+r)>>;
if(check(mid)) r=mid-;
else l=mid+;
}
cout<<l<<endl;
}

#include<iostream>
#include<set>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; typedef unsigned long long ll; ll h[],a[];
ll sum;
int main()
{
ll n,S,L,i,j,l,r,m;
while(cin>>n>>S>>L)
{
l=;r=1e18;m=(l+r)/;
for(i=;i<n;i++)
scanf("%d",&h[i]);
for(i=;i<n;i++)
scanf("%d",&a[i]);
while(l<r)
{
sum=;
for(i=;i<n;i++)
{
ll x=h[i]+m*a[i];
if(x>=L)
sum+=x;
if(sum>=S)
break;
}
if(sum>=S)
{
r=m;
}
else
{
l=m+;
}
m=(l+r)/;
}
cout<<m<<"\n";
}
return ;
}

易懂

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
int n;
ll s,l;
ll h[],a[];
int check(ll mid)
{
ll sum=;
for(int i=;i<=n;i++)
{
if(h[i]+a[i]*mid>=l) sum+=(h[i]+a[i]*mid);
if(sum>=s) return ;
}
return ;
}
ll maxx;
int main()
{
scanf("%d%lld%lld",&n,&s,&l);
for(int i=;i<=n;i++) scanf("%lld",&h[i]);
for(int i=;i<=n;i++) scanf("%lld",&a[i]),maxx=max(maxx,a[i]);
ll l=,r=1e18/maxx,mid,ans=;
while(l<=r)
{
mid=(l+r)/;
if(check(mid)) r=mid-,ans=mid;
else l=mid+;
}
printf("%lld",ans);
}

2

最新文章

  1. jquery版固定边栏滚动特效
  2. Dreamweaver 制作图片热点之后,点击热点部分会有个提示框,怎么去掉
  3. hibernate---核心开发接口1(重点)
  4. website architecture
  5. webstorm安装破解版
  6. VB程序破解之API断点[bp __vbaVarTstEq]
  7. fread遇到1A则读取停止,发现是1A是文件截止符
  8. MyBatis 注解
  9. POJ 1862 Stripies#贪心(水)
  10. mybatis 详解(十)------ 逆向工程
  11. 51、css初识
  12. 给 Android 开发者的一点福利:免费模拟面试
  13. java类的理解和相关问题
  14. (数学) PTA 1005 继续(3n+1)猜想 (25 分)
  15. JavaScript将字典序升序排列类似php中的ksort函数
  16. Beautiful Soup库基础用法(爬虫)
  17. 基于.net技术的 Rss 订阅开发
  18. MVC+Nhibernate+spring.net(三)
  19. Inter exchange Client Address Protocol (ICAP)- 互换客户端地址协议
  20. AME_PR采购申请单通过AME审批设定和测试(案例)

热门文章

  1. CodeIgniter学习笔记二:CI中的query_builder(AR)、连贯操作
  2. SDK支付流程
  3. Linux利用OneinStack搭建环境
  4. 孤荷凌寒自学python第十五天python循环控制语句
  5. 如何将自己写的代码上传到github上
  6. kubeadm部署k8s1.9高可用集群--4部署master节点
  7. [转] Linux命令行编辑常用键
  8. 历届试题 带分数 全排列模板 JAVA
  9. 第五章 Internet协议
  10. ocrosoft Contest1316 - 信奥编程之路~~~~~第三关问题 D: 手机话费