题目大意:给你400个房间,每个房间标号,一条栈道的上面全是奇数,下面全是偶数,每十分钟内每个位置的两个房间中间的栈道只能同行1次,问把这n条桌子从不同房间放到另一个房间中至少要几分钟。

解题思路:刚开始相当的思路是模拟数组,每次标记,结果WA,后来果断改变思路。觉得可能是类似于贪心或者动态规划的题,每个时间段搬桌子一定是越多越好,这样n条桌子才能更早地搬完。若何考虑每个时间段搬更多的桌子呢?你可以联想成一条布,你要减成更多条规格不同的布,怎么减得更多呢?即这些不同规格的布的头部的位置和尾部的位置要更靠近。我们用一个结构体保存每次的头和尾(即从一个房间搬到另一个),把信息预处理完排序,使得头部更紧密,然后就是“每一条长度相同的布减成规格不同的布”,即每次处理这些桌子。处理完后记得把本条信息标记,下次发现有标记的就不用减了。最后看看需要“几条这样长度相同的布”就是需要几个10分钟;看到别的大犇吧每次经过的栈道次数做记录(在本位置+1),然后最后看看那个位置的记录最大即经过次数最多,这个最大值就是answer。orz。(ps:预处理时要注意开头的房间比尾部的房间号数小

WA代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

void cmp(int *a,int *b)
{
	if(*a>*b)
	{
		int temp=*a;
		*a=*b;
		*b=temp;
	}
	if(*a&1==0)
		*a=*a-1;
	if(*b&1==1)
		*b=*b+1;
	return ;
}

int main()
{
	int n,t,i,j,a[401],data[200][2],tx,ty,cnt;
	cin>>t;
	while(t--)
	{
		cin>>n;
		cnt=10;
		memset(a,0,sizeof(a));
		for(i=0;i<n;i++)
			cin>>data[i][0]>>data[i][1];
		for(i=0;i<n;i++)
		{
			tx=data[i][0];
			ty=data[i][1];
			cmp(&tx,&ty);
			for(j=tx;j<=ty;j++)
			{
				if(a[j]==0)
				{
					a[j]=1;
				}
				else
				{
					cnt+=10;
					memset(a,0,sizeof(a));
					i--;
					break;
				}
			}
		}
		cout<<cnt<<endl;
	}
	return 0;
}
贪心AC:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct node
{
    int head,tail,flag;
}road[200];

int cmp(node a,node b)
{
    return a.head<b.head;
}

void swap(int *a,int *b)
{
	int temp=*a;
	*a=*b;
	*b=temp;
	return ;
}

int main()
{
    int t,i,j,n,tail,cnt;
    cin>>t;
    while(t--)
    {
        cin>>n;
        cnt=0;
        for(i=0;i<n;i++)
        {
            cin>>road[i].head>>road[i].tail;
            //预处理, 把房间号对应到门前的栈道号
            road[i].head=(road[i].head+1)/2;
            road[i].tail=(road[i].tail+1)/2;
	    if(road[i].head>road[i].tail)
		swap(&road[i].head,&road[i].tail);
            road[i].flag=0;
        }
        sort(road,road+n,cmp);  //使得头位置靠近,每一次能够装下得区间数更多
        for(i=0;i<n;i++)
        {
            if(!road[i].flag)
            {
                road[i].flag=1;
                tail=road[i].tail;
                for(j=i+1;j<n;j++)
                {
                    if(!road[j].flag && road[j].head>tail)  //本条信息没被用过并且合法
                    {
                        road[j].flag=1;
                        tail=road[j].tail;
                    }
                }
                cnt++;
            }
        }
        cout<<cnt*10<<endl;
    }
    return 0;
}


大犇AC代码:
    #include"cstdio"  
    #include"algorithm"  
    using namespace std;  
    int main()  
    {  
        int T;  
        scanf("%d",&T);  
        while(T--)  
        {  
            int n;  
            scanf("%d",&n);  
            int ans=0;  
            int zc[400]={0};  
            for(int j=0;j<n;j++)  
            {  
                int x,y;  
                scanf("%d%d",&x,&y);  
                if(x%2==0)  
                    x--;  
                if(y%2==0)  
                    y--;  
                int p=min(x,y);  
                int q=max(x,y);  
                for(int i=p;i<=q;i++)  
                    {  
                        zc[i]++;  
                        if(ans<zc[i])  
                            ans=zc[i];  
                    }  
            }  
            printf("%d\n",ans*10);  
        }  
        return 0;  
    }  

大犇思路: 点击打开链接