题目大意:给你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;
}
大犇思路: 点击打开链接