这道题算法分类为贪心 。
不过也要看怎么做了,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;
}
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;
}