ZOJ-1029-Moving Tables

这道题算法分类为贪心 。

不过也要看怎么做了,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;
}

 

你可能感兴趣的:(ZOJ-1029-Moving Tables)