• POJ3069(贪心+巧用优先队列)


    题目传送门:http://poj.org/problem?id=3069

    题目大意:一个直线上有N个点。点i的距离是Xi。从这些点中选取若干个加上标记。要求:对于每个点,与其距离为R的范围内必有做标记的点(包括自身)。求至少标记多少点才能满足要求。

    题目意思就是让找最少的标记点数,很好理解,贪心嘛,由于最近正在看优先队列,突然感觉这题也能用优先队列做,就实践了一发,也过了;

    话不多说上码:

    CODE:

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int r, n, num, num0;
     8     priority_queue<int, vector<int>, greater<int> > Q;//优先队列,不过多解释了
     9     while(scanf("%d%d",&r, &n) && (r != -1 || n != -1))
    10     {
    11         while(!Q.empty())
    12             Q.pop();
    13         for(int i = 0; i < n; i++)
    14         {
    15             scanf("%d", &num);
    16             Q.push(num);
    17         }
    18         int ans = 0;//最终要输出的答案
    19         while(Q.size() > 0)
    20         {
    21             int mid = Q.top();//此时的mid表示最左边的点
    22             while(Q.size() > 0)//这层循环就是找那个要标记的点
    23             {
    24                 if(mid + r >= Q.top())
    25                 {
    26                     num0 = Q.top();
    27                     Q.pop();
    28                 }
    29                 else
    30                 {
    31                     mid = num0;//此时mid就是要标记的那个点
    32                     break;
    33                 }
    34             }
    35 
    36             while(Q.size() > 0)//这层循环呢就是找到右边界
    37             {
    38                 if(mid + r >= Q.top())
    39                     Q.pop();
    40                 else
    41                  break;
    42             }
    43             ans++;
    44         }
    45         printf("%d
    ",ans);
    46     }
    47     return 0;
    48 }

    虽说用了优先队列,但是没有过多技术成分,个人感觉比较顺手。。。

  • 相关阅读:
    大话设计模式笔记 观察者模式
    nginx限速
    枚举实现的单例模式
    Nginx负载均衡
    插件lombok的介绍安装
    ThreadLocal类
    CopyOnWriteArrayList并发容器
    ConcurrentHashMap实现原理
    elasticsearch配置文件
    sql优化
  • 原文地址:https://www.cnblogs.com/x-1204729564/p/6341066.html
Copyright © 2020-2023  润新知