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

湫湫系列故事——减肥记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
1 15:36 18:40 4 01:35 10:36 04:54 22:36 10:18 18:40 11:47 17:53
 Sample Output
1256 179
Hint
大量输入,建议用scanf读数据。
 Source

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

问题简述参见上文。

问题分析

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

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

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

程序说明

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

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

题记:(略)


参考链接:(略)


AC的C语言程序如下:

/* HDU4509 湫湫系列故事——减肥记II */

#include <stdio.h>
#include <string.h>

#define N 24 * 60

char 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
", ans);
    }

    return 0;
}




原文地址:https://www.cnblogs.com/tigerisland/p/7563585.html