日志1:一个二分题目

题目:

 小小闯关

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

yihang_01穿越到了一个闯关游戏中,在这个游戏中总共有n个关卡,每个关卡都有一个防御力为ai和攻击力为bi的门卫,yihang_01具有一个体力值x,每回合yihang_01先进行攻击,攻击力为他当前的体力值x,若x ≥ ai则视为击杀门卫成功,yihang_01吸收当前守卫的防御力化为自身体力,并且进入下一关,否则yihang_01会被门卫反击,体力值减少bi点,进入下一关,当闯关过程中体力 ≤ 0则视为游戏失败,结束游戏

无论是否击败门卫都不影响yihang_01挑战下一关

现在yihang_01并不想打败所有门卫,他想知道最少需要多少最初体力值才能至少打败k个门卫并且能够通关该闯关游戏

即求一个最小的x,使得yihang_01至少能够击败k个守卫并且成功通关游戏

Input

第一行两个整数n, k,分别代表关卡个数以及至少需要打败的门卫数量

第二行为n个整数,a1, a2......an,ai代表第i位门卫的防御力

第三行为n个整数,b1, b2......bn,bi代表第i位门卫的攻击力

1 ≤ k ≤ n ≤ 106, 0 ≤ ai, bi ≤ 109

Output

每个样例输出一个整数x,代表最初体力值最少为x才能使yihang_01至少打败k个守卫并且通关游戏

Examples

input

Copy

10 3
5 2 2 4 5 6 3 8 7 9
1 1 2 3 1 4 2 1 1 5

output

Copy

3

input

Copy

5 1
4 2 1 2 3
1 9 1 5 11

output

Copy

3

Note

在第一个样例中,最小体力值为3

倘若为2,闯完第一关体力值剩余1,闯到第二关时体力值剩余0,闯关失败

体力值为3时,第一关过后体力值剩余2,第二关过后体力值剩余4,此后所有门卫都可以击败

代码:


 
  1. #include<bits/stdc++.h>
  2. #define endl '\n'
  3. #define int long long
  4. using namespace std;
  5. const int N=1e6+9;
  6. int n,k;
  7. int a[N],b[N];
  8. signed main(){
  9. ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
  10. cin>>n>>k;
  11. for(int i=1;i<=n;i++)
  12. {
  13. cin>>a[i];
  14. }
  15. for(int i=1;i<=n;i++)
  16. {
  17. cin>>b[i];
  18. }
  19. int l=0,r=1e16;
  20. while(l<r)
  21. {
  22. int temp=0;
  23. bool flag=1;
  24. int mid=(l+r)/2;
  25. int x=mid;
  26. for(int i=1;i<=n;i++)
  27. {
  28. if(x>=a[i])
  29. {
  30. x+=a[i];
  31. temp++;
  32. }
  33. else if(x<a[i])
  34. {
  35. x-=b[i];
  36. if(x<=0&&i<n)
  37. {
  38. flag=0;
  39. break;
  40. }
  41. }
  42. }
  43. //cout<<mid<<'\n';
  44. if(temp>=k&&flag==1) r=mid;
  45. else l=mid+1;
  46. }
  47. cout<<l<<'\n';
  48. return 0;
  49. }
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值