HDU4509 湫湫系列故事——减肥记II【格式输入+存储设置+暴力+水题】

来源:互联网 发布:ipad商标侵权案 知乎 编辑:程序博客网 时间:2024/06/10 16:56

湫湫系列故事——减肥记II

Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 3458    Accepted Submission(s): 1456

Problem Description
  虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动!
于是,结果显而易见…
  但是没有什么能难倒高智商美女湫湫的,她决定另寻对策——吃没关系,咱吃进去再运动运动消耗掉不就好了?
  湫湫在内心咆哮:“我真是天才啊~\(≧▽≦)/~”

  可是,大家要知道,过年回家多忙啊——帮忙家里做大扫除,看电影,看小说,高中同学聚餐,初中同学聚餐,小学同学聚餐,吃东西,睡觉,吃东西,睡觉,吃东西,睡觉……所以锻炼得抽着时间来。

  但是,湫湫实在太忙了,所以没时间去算一天有多少时间可以用于锻炼,现在她把每日行程告诉你,拜托你帮忙算算吧~

  皮埃斯:一天是24小时,每小时60分钟
Input
输入数据包括多组测试用例。
每组测试数据首先是一个整数n,表示当天有n件事要做。 
接下来n行,第i行是第i件事的开始时间和结束时间,时间格式为HH:MM。

[Technical Specification]
1. 1 <= n <= 500000
2. 00 <= HH <= 23
3. 00 <= MM <= 59
Output
请输出一个整数,即湫湫当天可以用于锻炼的时间(单位分钟)
Sample Input
115:36 18:40401:35 10:3604:54 22:3610:18 18:4011:47 17:53
 Sample Output
1256179
Hint
大量输入,建议用scanf读数据。
 Source
2013腾讯编程马拉松初赛第一场(3月21日)

问题链接:HDU4509 湫湫系列故事——减肥记II

问题简述参见上文。

问题分析

这个问题可以用线段树来解决。然而,暴力法+程序技巧也是能够解决问题的。

一天有24小时,共24*60=1440分钟。

给定的时间范围也许有重叠,所以可以对一天中的每件事情的每一分钟进行标记,再统计未被标记的分钟数,就是能够用于锻炼。

程序说明

标记数组flag[]的类型是关键,用char类型是最合适的(用int的话,既浪费存储又浪费时间),可以最佳配合函数memset(),时间上也应该是快的。

函数memset()的使用方式也是这个程序的一个要点,该函数是可以进行局部设置的。

题记:(略)


参考链接:(略)


AC的C语言程序如下:

/* HDU4509 湫湫系列故事——减肥记II */#include <stdio.h>#include <string.h>#define N 24 * 60char flag[N + 1];int main(void){    int n, sh, sm, eh, em, i;    while(scanf("%d", &n) != EOF) {        memset(flag, 1, sizeof(flag));        while(n--) {            scanf("%d:%d%d:%d", &sh, &sm, &eh, &em);            int start = sh * 60 + sm;            int end = eh * 60 + em;            memset(flag + start, 0, end - start);        }        int ans = 0;        for(i=0; i<N; i++)            if(flag[i])                ans++;        printf("%d\n", ans);    }    return 0;}




阅读全文
0 0
原创粉丝点击