poj1083

虽然这是一道水题,但是我还是搞了很久...

poj1083

讲述要将桌子从一个房间移动到另一个房间,耗时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;
}
 

 

你可能感兴趣的:(C++,c,C#)