糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

POJ 2376 Cleaning Shifts 贪心+快排

思路:
按照每个区间[a, b]中的a来从小到大排序。
第一次,计算开头落在 [0, 0] 之间的区间[a, b]中,b的最大值 b1。
第二次,计算开头落在 [0, b1 + 1] 之间的区间[a, b]中,b的最大值 b2。
第三次,计算开头落在 [b1 + 1, b2 + 1] 之间的区间 [a, b] 中,b的最大值 b3。
。。。

#include <stdio.h>
#include 
<stdlib.h>

struct node {
    
int start, end;
}
;

struct node arr[25032];
int N, T;

int cmp(const void *a, const void *b)
{
    
return ((struct node *)a)->start - ((struct node *)b)->start;
}


int main()
{
    
int i, max_val, cnt, end;

    freopen(
"e:\\test\\in.txt""r", stdin);

    scanf(
"%d%d"&N, &T);
    
for (i = 0; i < N; i++
        scanf(
"%d%d"&arr[i].start, &arr[i].end);
    qsort(arr, N, 
sizeof(arr[0]), cmp);
    i 
= cnt = 0;
    end 
= 1;
    
while (end <= T) {
        max_val 
= 0;
        
while (i < N && arr[i].start <= end) {
            
if (arr[i].end > max_val)
                max_val 
= arr[i].end;
            i
++;
        }

        
if (!max_val)
            
break;
        end 
= max_val + 1;
        cnt
++;
    }

    printf(
"%d\n", end == T + 1 ? cnt : -1);
}

posted on 2010-03-09 13:37 糯米 阅读(676) 评论(3)  编辑 收藏 引用 所属分类: POJ

评论

# re: POJ 2376 Cleaning Shifts 贪心+快排  回复  更多评论   

诶,我提交下,发现不能AC
2010-08-19 12:23 | youke

# re: POJ 2376 Cleaning Shifts 贪心+快排  回复  更多评论   

@youke
freopen("e:\\test\\in.txt", "r", stdin);
这句话去掉了吗?
2010-08-19 12:31 | 糯米

# re: POJ 2376 Cleaning Shifts 贪心+快排  回复  更多评论   

@糯米
恩,删去了倒是可以AC 。总觉得printf("%d\n", end == T + 1 ? cnt : -1);有点悬。要是给的数据:
1 10
1 100
就是-1了。写的很精彩啊,灰常简练~~
2010-08-19 17:27 | youke

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理