FZU 2203 单纵大法好 (二分)

悠悠 2022-06-14 05:56 230阅读 0赞

题目链接:
Fzu 2203

题解:
二分。
问你老S最晚将被哪个炮弹第一次击中?显然符合答案单调性。二分一下位置在check一下就可以了。

代码:

  1. //#include <bits/stdc++.h>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <cstring>
  6. using namespace std;
  7. typedef long long ll;
  8. int w,num,len;
  9. const int N=200000+10;
  10. int a[N];
  11. int b[N];
  12. int check(int n)
  13. {
  14. for(int i=1;i<=n;i++)b[i]=a[i];
  15. sort(b+1,b+1+n);
  16. int cnt = 0;
  17. b[0] = 0;
  18. b[n+1] = w+1;
  19. for(int i=0;i<=n;i++){
  20. cnt+=(b[i+1]-b[i])/(len+1);
  21. }
  22. if(cnt >= num) return 1;
  23. return 0;
  24. }
  25. int main()
  26. {
  27. while(cin>>w>>num>>len)//地图长度,战舰数,战舰长度
  28. {
  29. int n;
  30. scanf("%d",&n);
  31. for(int i=1;i<=n;i++)//炮弹的位置
  32. {
  33. scanf("%d",&a[i]);
  34. }
  35. int l = 1, r = n;
  36. int mid;
  37. while(l<=r)
  38. {
  39. mid = (l+r)>>1;
  40. if(check(mid)){
  41. l = mid+1;
  42. }
  43. else
  44. r = mid-1;
  45. }
  46. if(check(n)) puts("-1");
  47. else cout<<l<<endl;
  48. }
  49. return 0;
  50. }

发表评论

表情:
评论列表 (有 0 条评论,230人围观)

还没有评论,来说两句吧...

相关阅读

    相关 FZu 2134

    /该题本来是可以用树状数组写的 但是个人觉得简单,就用普通方法直接AC了, / include<iostream> include<