POJ 1083 Moving Tables 贪心

题意:已知有400个房间,有n张桌子必须从a 房间搬到 b 房间,搬每张桌子所花的时间都是10分钟。走廊上每次只能容下一张桌子,但是不同的地方允许同时搬运。求将所有的桌子全部搬完最少要花多少时间。
POJ 1083 Moving Tables 贪心_第1张图片
题解:给出两种解法。

#include <cstdlib>
#include <iostream>
using namespace std;

struct item
{
	int a, b, flag;
} move [201];

int cmp ( const void *x, const void *y )
{
	struct item *c,*d;
	c=(struct item *)x;
	d=(struct item *)y;
	return c->a - d->a;
}

int main()
{
	int T;
	cin >> T;
	while ( T-- )
	{
		int n, i, j;
		cin >> n;
		for ( i = 0; i < n; i++ )
		{
			cin >> move[i].a >> move[i].b;
			if ( move[i].a > move[i].b )
				swap ( move[i].a, move[i].b );
			if ( move[i].a % 2 == 0 )
				move[i].a --;
			if ( move[i].b % 2 == 1 )
				move[i].b ++;
			move[i].flag = 0;
		}

		qsort ( move, n , sizeof(struct item), cmp );

		int index, counter = n * 10;
		for ( i = 0; i < n-1; i++ )
		{
			index = i;
			if ( move[i].flag != 1 )
			{
				for ( j = i+1; j < n; j++ )
				{
					if ( move[j].flag != 1 &&  move[i].b < move[j].a )
					{
						move[j].flag = 1;
						counter -= 10;
						i = j;
					}
				}
				i = index;
			}
		}
		cout << counter << endl;
	}
	return 0;
}

当然下面的做法也可以。因为若在某一段(任意长)的走廊上,花的时间最长,那么这段这段时间就代表了总时间。因此,我们只需要找出最繁忙的走廊所经历的次数(最大次数),再乘以10,即得总时间。
#include <iostream>
using namespace std;

int main()
{
	int t;
	cin >> t;
	while ( t-- )
	{
		int n, start, end, i, j;
		int corridor[201] = { 0 };
		cin >> n;
		for ( i = 0; i < n; i++ )
		{
			cin >> start >> end;
			if ( start > end )
				swap ( start, end );
			for ( j = ( start - 1 ) / 2; j <= ( end - 1 ) / 2; j++ )
				++corridor[j];
		}
		
		int max = -1;
		for ( i = 0; i < 201; i++ )
			if ( corridor[i] > max )
				max = corridor[i];
			cout << max * 10 << endl;
	}
	return 0;
}




你可能感兴趣的:(c,struct)