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: 贪心
- #include <stdio.h>
- #include <algorithm>
- using namespace std;
- typedef struct Point{
- short left;
- short right;
- bool operator()(Point a,Point b) {
- return( a.left == b.left ?a.right < b.right:a.left< b.left);
- }
- }Point;
- Point point[10010];
- int main()
- {
- int n;
- scanf("%d",&n);
- for(int i = 0; i < n; i++)
- scanf("%d%d",&point[i].left,&point[i].right);
- // 对数组排序以进行贪心
- sort(point,point+n,Point());
- int count = 2;
- // l 储存现有的左指针,r储存右指针
- int l,r;
- r = point[0].right;
- l = r - 1;
- for(int i = 1; i < n; i++) {
- // 如果 r 比这个点的左节点还小的话
- // 意味着它们没有重叠的地方
- if(point[i].left > r) {
- count += 2;
- r = point[i].right;
- l = r - 1;
- continue;
- }
- if(l < point[i].left) {
- // !!! 下面这一句灰常重要 看图
- l = (r > point[i].right - 1) ?point[i].right - 1:r;
- r = point[i].right;
- count++;
- continue;
- }
- //如果右指针在现有区间右节点的右边,就把它放至该区间右节点
- if(r > point[i].right)
- r = point[i].right;
- }
- printf("%d/n",count);
- }
当输入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上的某些人的留言。