这道题算法分类为贪心 。
不过也要看怎么做了,400个房间面对面,走廊分为200个段,用map[]表示,把输入的房间房间号做一个(x+1)/2的转换,便是它占用的段数,不过记得整个算式是针对int变量的。接着就把输入的两个房间段之间的map[]值全部加1,最后数一下最大数字就OK了,输出时乘个10。
程序很简单,几分钟就写好,可是WA了两次又让我郁闷要死,怎么想方法都应该没错啊,后来只好在ZOJ的论坛上搜索,意外得发现一组测试数据:
3
100 10
80 60
30 50
一看见就想骂人。。。题目中给了那么多数据全部都是先小后大的。。。于是加了几行代码,要是先大后小就交换一下。。。然后就AC了。。。ft!
还有就是AC以后我又试了一下,如果不把房间号转成段数而直接用的话,会WA的。
TIME: 00:00.01
MEMORY:832K
#include <iostream>
using namespace std;
#define MAXN 201
int map[MAXN];
void solve()
...{
int i,n,start,end,m;
for(i=0;i<MAXN;i++)//初始化
map[i] = 0;
cin >> n;
while(n--)
...{
cin >> start;
cin >> end;
if(start > end)
...{
int temp = start;
start = end;
end = temp;
}
for(i=(start+1)/2;i<=(end+1)/2;i++)
map[i] += 1;
}
m = map[1];
for(i=2;i<MAXN;i++)
...{
if(map[i]>m)
m = map[i];
}
cout << m*10 << endl;
}
int main()
...{
int t;
cin >> t;
while(t--)
solve();
return 0;
}
本文介绍了一种使用贪心算法解决走廊人流管理问题的方法。通过将房间号转化为段数并利用map数组记录每段走廊的使用次数,最终找出走廊中最繁忙的部分。文章还讨论了特殊情况下的代码调整。
783

被折叠的 条评论
为什么被折叠?



