链接:click here~
题意:在一个长走廊里搬桌子,走廊的两侧都是房间,把桌子从一个房间搬到另外一个房间,走廊的宽度只能允许一个桌子通过,每次搬桌子需要10分钟(每一次允许再不交叉的走廊中同时搬桌子),问最少多长时间搬完!
【解题思路】
这题也是想了好久,关键点:由于房间是奇偶分开的,所以先把他们换成连续的自然数,即n=(n-1)/2.这样对门的就变成一个编号了,这点是关键,感觉好厉害(因为房间是对称分布的,需要注意一下奇偶的情况。)利用房间号分割走廊,贪心实现求走廊的最大重叠数
这里使用了C++容器的STL*max_element函数找最大元素 类似的*min_element是求函数找最小元素 .
代码:
#include <string.h> #include <stdio.h> #include <math.h> #include <iostream> #include <algorithm> using namespace std; const int maxn=205; int a[maxn]; int main() { int n,m,i,j; scanf("%d",&n); while(n--) { int aa,bb; scanf("%d",&m); memset(a,0,sizeof(a)); for(i=0; i<m; i++){ scanf("%d%d",&aa,&bb); if(aa>bb) swap(aa,bb); for(j=(aa-1)/2; j<=(bb-1)/2; j++)//由于房间是奇偶分开的,所以先把他们换成连续的自然数,即n=(n-1)/2.这样对门的就变成一个编号了 a[j]++; } printf("%d\n",*max_element(a,a+205)*10);//寻找最大元素 } return 0; }
【贪心专题】HDU 1050 D - Moving Tables (移桌子)
原文地址:http://blog.csdn.net/u013050857/article/details/44915729