1716 Integer Intervals 解题报告

来源:互联网 发布:谁有九九网络斗地主 编辑:程序博客网 时间:2024/05/09 15:13

AccecptTime:          2008-12-24 17:47:56   2008-12-24 17:51:06
Language:                C++
Memory:                  224K  204K
Time:                       0MS   32MS
Errors:                     1 WA
Algorithm:                贪心

 

  1. #include <stdio.h>
  2. #include <algorithm>
  3. using namespace std;
  4. typedef struct Point{
  5.     short left;
  6.     short right;
  7.     bool operator()(Point a,Point b) {
  8.         return( a.left == b.left ?a.right < b.right:a.left< b.left);
  9.     }
  10. }Point;
  11. Point point[10010];
  12. int main()
  13. {
  14.     int n;
  15.     scanf("%d",&n);
  16.     for(int i = 0; i < n; i++)
  17.         scanf("%d%d",&point[i].left,&point[i].right);
  18.     // 对数组排序以进行贪心
  19.     sort(point,point+n,Point());
  20.     int count = 2;
  21.     // l 储存现有的左指针,r储存右指针
  22.     int l,r;
  23.     r = point[0].right;
  24.     l = r - 1;
  25.     for(int i = 1; i < n; i++) {
  26.         // 如果 r 比这个点的左节点还小的话
  27.         // 意味着它们没有重叠的地方
  28.         if(point[i].left > r) {
  29.             count += 2;
  30.             r = point[i].right;
  31.             l = r - 1;
  32.             continue;
  33.         }
  34.         if(l < point[i].left) {
  35.             // !!! 下面这一句灰常重要 看图
  36.             l = (r > point[i].right - 1) ?point[i].right - 1:r; 
  37.             r = point[i].right;
  38.             count++;
  39.             continue;
  40.         }
  41.         //如果右指针在现有区间右节点的右边,就把它放至该区间右节点
  42.         if(r > point[i].right)
  43.             r = point[i].right;
  44.         }
  45.     printf("%d/n",count);
  46. }

当输入4    1 3     3 8    4 5    5 7 时图:

1 2 3 4 5 6 7 8

------

     --------------

         ----

            ------

如果没有要“注意”的那段话则会输出4而标准答案是5

 

现在有一个习惯,就是有空的时候就上上poj找一道以前没过的水题来刷刷。这题就是其中一道。发现了一个以前没发现的bug,ac了。另外如果用new的话可能导致时间的浪费,上边的32ms就是因为用了new。另外提醒自己别乱相信oj上的某些人的留言。

原创粉丝点击