• 2013腾讯编程马拉松初赛第一场(3月21日) 湫湫系列故事——减肥记II ----线段树


    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4509

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

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

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

    皮埃斯:一天是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

    解题思路:

    设线段坐标范围为[min,max]。使用一个下标范围为[min,max-1]的一维数组,其中数组的第i个元素表示[i,i+1]的区间,数组元素初始化全部为0。对于每一条区间为[a,b]的线段,将[a,b]内所有对应的数组元素均设为1 最后统计数中 1 的个数即可。
          #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <cstdio> 
    using namespace std;
    const int maxtime=1440;
    int num[maxtime+1];
    int main()
    {
    	int n;
    	while(scanf("%d",&n)!=EOF)
    	{
    		int left,right;
    		int ans=0;
    		memset(num,0,sizeof(num));
    		for(int i=0;i<n;i++)
    		{
    			int a,b,c,d;
    			scanf("%d",&a);
    			cin.get();
    			scanf("%d %d",&b,&c);
    			cin.get();
    			scanf("%d",&d);
    			left=a*60+b;
    			right=c*60+d;
    			for(int i=left;i<=right-1;i++)
    				num[i]=1;
    		}
    		for(int i=0;i<maxtime+1;i++)
    		{
    			if(num[i]==0)continue;
    			ans++; 
    		}
    		cout<<maxtime-ans<<endl;
    	}
    	return 0;
    }


  • 相关阅读:
    eclipse环境:把jdk1.6 改 jdk1.7或jdk1.8(改回也可以)(图文详解)
    SVN 将文件还原到之前的指定版本
    用起来很方便的枚举扩展类
    VS2015新功能
    EasyUi 动态列
    基于EasyUi的快速开发框架
    深圳某保险公司招聘职位列表
    考勤系统之计算工作小时数
    考勤系统之状态管理
    第一次裁员
  • 原文地址:https://www.cnblogs.com/riskyer/p/3233924.html
Copyright © 2020-2023  润新知