虽然这是一道水题,但是我还是搞了很久...
讲述要将桌子从一个房间移动到另一个房间,耗时10分钟,需要注意的是a移动到b,但a可能大于b.用数组a存储每个任务的开始房间,数组b存储每个任务的结束房间,数组c记录每个任务是否已经完成.输入完所有任务后,将开始房间比结束房间小的调换过来,并将所有任务按从开始房间号小到大的顺序排序.
然后枚举每一个任务,如果任务已经完成则跳过,否则将该任务的结束房间号用变量存储起来,号为奇数时变量加1,因为如:1-3时,4-5数字上来看是可以进行,但实际是不能进行的.所以必须加1.检测该任务后面的任务是否能与其同时进行.如果后面的任务已完成则跳过,未完成则检测.检测如果能同时进行,则将后者的结束房间号赋值给变量.同时要看是否是奇数要加1.
#include <stdio.h>
int a[201],b[201],c[201];
int main(int argc, char* argv[])
{
int t,k,l,p;
scanf("%d",&t);
for(int i=0;i<t;++i)
{
for(k=0;k<201;++k)
c[k]=0;
int n;
scanf("%d",&n);
for(k=0;k<n;++k)
scanf("%d %d",&a[k],&b[k]);
for(k=0;k<n;++k)
{
if(a[k]>b[k])
{
p=a[k];
a[k]=b[k];
b[k]=p;
}
}
for(k=0;k<n;++k)
{
for(l=k+1;l<n;++l)
{
if(a[k]>a[l])
{
p=a[k];
a[k]=a[l];
a[l]=p;
p=b[k];
b[k]=b[l];
b[l]=p;
}
}
}
int s=0;
int end;
for(k=0;k<n;++k)
{
if(c[k])
continue;
end=b[k];
if(end%2==1)
end++;
s+=10;
c[k]=1;
for(l=k+1;l<n;++l)
{
if(c[l]||a[l]<=end)
continue;
else{
c[l]=1;
end=b[l];
if(end%2==1)
++end;
}
}
}
printf("%d\n",s);
}
return 0;
}