您的位置:首页 > 其它

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

2017-07-24 19:35 483 查看

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

Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)

Total Submission(s): 3458    Accepted Submission(s): 1456

[align=left]Problem Description[/align]
  虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动!

于是,结果显而易见…

  但是没有什么能难倒高智商美女湫湫的,她决定另寻对策——吃没关系,咱吃进去再运动运动消耗掉不就好了?

  湫湫在内心咆哮:“我真是天才啊~\(≧▽≦)/~”

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

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

  皮埃斯:一天是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
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 * 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\n", ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: