【贪心+二分查找】Office Keys CodeForces - 830A

£神魔★判官ぃ 2022-06-08 22:59 250阅读 0赞

Think:
1知识点:贪心+二分查找
2题意:n个人初始出发位置,m把钥匙放置位置,办公室位置p,询问在所有人取到钥匙之后到达办公室的最短时间
3反思:
1>初始忘记排序
2>最初选择的贪心策略无法得到全局最优解
4解题方法:
二分枚举逼近可能的最短时间,然后试探当前选择的时间是否可以满足所有人取到钥匙后到达办公室

vjudge题目链接

可参考博客

以下为Accepted代码

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cmath>
  5. using namespace std;
  6. typedef long long LL;
  7. const int N = 1014;
  8. const int M = 2014;
  9. int n, m, p, a[N], b[M];
  10. bool Check(LL ans);
  11. int main(){
  12. while(~scanf("%d %d %d", &n, &m, &p)){
  13. for(int i = 0; i < n; i++)
  14. scanf("%d", &a[i]);
  15. for(int i = 0; i < m; i++)
  16. scanf("%d", &b[i]);
  17. sort(a, a+n);
  18. sort(b, b+m);
  19. LL l = 0, r = 2e9, mid, ans;
  20. while(l <= r){
  21. mid = (l+r)>>1;
  22. if(Check(mid)){
  23. ans = mid;
  24. r = mid-1;
  25. }
  26. else
  27. l = mid+1;
  28. }
  29. printf("%lld\n", ans);
  30. }
  31. return 0;
  32. }
  33. bool Check(LL ans){
  34. int i, pos = -1;
  35. for(i = 0; i < n; i++){
  36. while(pos < m){
  37. pos++;
  38. if(abs(a[i]-b[pos])+abs(b[pos]-p) <= ans)
  39. break;
  40. }
  41. if(pos >= m)
  42. return false;
  43. }
  44. return true;
  45. }

发表评论

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

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

相关阅读

    相关 查找——二分查找

    基本思想 二分查找是建立在有序顺序表基础上的!步骤如下: 1.      将表中间位置记录的关键字与给定K值进行比较,若两者相等,则查找成功。 2.    

    相关 Codeforces 353E 贪心

    题意:给你一张有向图,第i条边连接i号点和(i + 1) % n号点,问最多可以选择多少个点,使得这些点互相不可达。 思路:容易发现,如果某个边的集合点的数目大于等于2,那么