zoukankan      html  css  js  c++  java
  • 【hdoj_1050】Moving Tables

    题目链接

    http://acm.hdu.edu.cn/showproblem.php?pid=1050


    题意为:

    为了叙述方便,把一个房间里面的桌子移动到另一个房间称为一个移动,给出若干个要求完成的移动,任意两个移动仅在移动路线不相交的情况下可以同时进行,求出移动所需花费的最小次数(时间).

    注意:

    出现有"对门"的路线,不能同时移动,例如,[2,4]和[3,5]不能同时进行,因为3和4对门.

    路线重叠:

    凡是路线重叠的两个移动,不能同时进行.路线重叠例如,[1,4]和[2,5]路线重叠,[2,4]和[3,5]路线重叠,[4,2]和[5,3]路线重叠.根据题意,可以看出,移动的顺序对于路线是否重叠没有影响.另外,对门的位置可以看做一个位置.

    思路:将每一条移动路线看做一条直线,假设所有的移动同时进行,则会有多个地方出现直线重叠的情况,求出重叠的最大层数(有多少条直线在同一处重叠最多)

    C++代码如下

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int main()
    {
    	int T;
    	cin >> T;//测试次数 
    	int start,end;//每次移动的起始位置 
    	while(T--)
    	{
    		int n;//每次测试中,移动的个数 
    		cin >> n;
    		int a[200] = {0};//记录每个位置的重叠的次数,开始都为0.
    						//一共有400个房间,由于对门位置看做一个位置,所以共有200个位置. 
    		for(int i=0;i<n;i++)//针对每个移动而言. 
    		{
    			cin >> start >> end;
    			
    			start = (start+1)/2;
    			end = (end+1)/2;//这样处理之后,对门位置变为一个位置.可以把两个 + 同时改为 - 也正确. 
    			
    			int max = std::max(start,end);//为了下面循环而作的处理 
    			int min = std::min(start,end);
    			for(int k=min;k<=max;k++)//看看这个移动为200个位置上的重叠次数的贡献是多大. 
    				a[k] ++;	
    		}
    		int max = -1;
    		for(int i=0;i<200;i++)//找出数组a中最大值 
    		{
    			if(a[i]>max)
    			{
    				max = a[i];
    			}
    		}
    		cout << 10*max << endl;
    	}
    	
    	return 0;
    }
    参考:

    http://www.cnblogs.com/ahu-shu/p/3551829.html

  • 相关阅读:
    【算法笔记】多线程斐波那契数列
    RAID技术详解
    Mysql 语句汇总(性能篇)
    JS 网页打印解决方案
    MyEclipse修改
    几个需要学习的点和技术
    MyEclipse配色字体等配置的解决方案
    使用hibernate 分表做增删改查
    Web平台开发流程以及规范
    easyui使用总结
  • 原文地址:https://www.cnblogs.com/tensory/p/6590770.html
Copyright © 2011-2022 走看看