貌似很简单的一道题目,可我却用了好长时间,哎、、、得多练练啊,废话不多说了,写下分析和代码,思路:
假设从1->399(或者2->400)的走廊是一条线段,每搬一张桌子(如从30号房间搬到40号房间),则线段30->40被重复了一次。如果另外再搬一张桌子(如从35号房间搬到45号房间),则线段35->45被重复了一次。而相同的线段35->40则被重复了两次。问题转化为求最大重复次数。
那很好办了,一个201大小的数组表示走廊位置,初始化为0. 若30->40重复(30号房间搬桌子到40号房间),则对30,31,32……40号房间对应的走廊位置上都加1,第二次35->45,又对35->45号房间对应的走廊位置加1。全部完成后,找出走廊最大值的位置,乘以10分钟,则是所用时间。
代码如下:
#include<iostream>
using namespace std;
int arr[201];
int main()
{
//freopen("in.txt","r",stdin);
int T;
cin>>T;
while(T--)
{
memset(arr,0,sizeof(arr));
int N;
cin>>N;
int max=0;
for(int i=0;i<N;++i)
{
int s,t;
cin>>s>>t;
if(s>t)
{
int temp=t;
t=s;
s=temp;
}
s=(s+1)/2;
t=(t+1)/2;
for(int j=s;j<=t;++j)
{
arr[j]++;
if(arr[j]>max)
max=arr[j];
}
}
cout<<max*10<<endl;
}
return 0;
}