HDU OF 4509 湫湫系列故事——减肥记II
/*
2013年3月23日16:54:09
HDU OJ 4509
也是 腾讯马拉松 2月21日 第5题
*/
#include <stdio.h>
bool is_later(int h1, int m1, int h, int m) //判断某时间点是否在开始时间点后
{
if ((h>h1) || ((h==h1)&&(m>=m1)))
return true;
else
return false;
}
bool is_former(int h2, int m2, int h, int m) //判断某时间点是否在结束时间点前
{
if ((h<h2) || ((h==h2)&&(m<m2)))
return true;
else
return false;
}
bool is_invade(int h1, int m1, int h2, int m2, int h, int m) //判断改时间点是否被这件事占用
{
if (is_later(h1, m1, h, m) && is_former(h2, m2, h, m))
return true;
else
return false;
}
int main()
{
int n, i, j;
int h1, m1, h2, m2, h, m;
int time[24][60];
int free_time;
while (scanf("%d", &n) != EOF)
{
for (i = 0; i < 24; i++) //标志量初始化,表示每个时间点未被占用
{
for (j = 0; j < 60; j++)
{
time[i][j] = 0;
}
}
for (i = 0; i < n; i++) //对每件事进行分析,看它占用了哪些时间点
{
scanf("%d:%d %d:%d", &h1, &m1, &h2, &m2);
for (h = 0; h < 24; h++)
{
for (m = 0; m < 60; m++)
{
if (time[h][m] == 0)
{
if (is_invade(h1, m1, h2, m2, h, m))
time[h][m] = 1;
}
}
}
}
free_time = 0;
for (h = 0; h < 24; h++) //统计空余时间
{
for (m = 0; m < 60; m++)
{
if (!time[h][m])
free_time++;
}
}
printf("%d\n", free_time);
}
return 0;
}
/*
思路:
该题采用了 标记量 的方式,来标记哪些时间被占用,哪些未被占用。
总结:
1. 确定了 内联函数 确实能用,但是发现 是否是内联函数 运行时间一样长!
2. 确定了 bool类型 确实能用。
3. 当初没有做出来的原因:
① 审题错误,导致第一回思路错误
② 想采用更好算法,导致 逻辑过于复杂,程序出现了错误。
4. 这回 花了一个小时 才做出来, 原因:
程序出了错误,调试了半天。
错误原因:
① 把 == 写成了 =
② bool 变量 默认返回 true,因此需要考虑返回 false情况。
*/
本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8738478