ECfinal UVALive 7512 November 11th (公式)

_TCgogogo_發表於2016-03-31

題目大意:一共R排,每排S個座椅,一共有B個座椅是壞的,坐的時候要求相鄰兩個位置只能坐一個人,求最多和最少坐多少人後不能再坐人

題目分析:預處理壞的位置,為了方便計算,在最左和最右再加兩列壞的座位,然後只要列舉任意兩對壞座位之間的情況即可,最大時偶數除/2,奇數/2+1,最小時每三個位子坐一個人能佔據的空間最大

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 1005;
int r, s, b;
int a[MAX][MAX];

struct B
{
	int x, y;
}bk[MAX * 10];

bool cmp(B a, B b)
{
	if(a.x == b.x)
		return a.y < b.y;
	return a.x < b.x;
}

int get_ma(int x)
{
	if(x == 0)
		return 0;
	if(x < 3)
		return 1;
	if(x & 1)
		return (x + 1) / 2;
	return x / 2;
}

int get_mi(int x)
{
	if(x == 0)
		return 0;
	if(x < 3)
		return 1;
	return x / 3 + (x % 3 != 0);
}

int main()
{
	int T;
	scanf("%d", &T);
	for(int ca = 1; ca <= T; ca++)
	{	
		int cnt = 0;
		scanf("%d %d %d", &r, &s, &b);
		for(int i = 0; i < b; i++)
		{
			scanf("%d %d", &bk[cnt].x, &bk[cnt].y);
			bk[cnt].x ++;
			bk[cnt].y ++;
			cnt ++;
		}
		for(int i = 1; i <= r; i++)
		{
			bk[cnt].x = i;
			bk[cnt].y = 0;
			cnt ++;
			bk[cnt].x = i;
			bk[cnt].y = s + 1;
			cnt ++;
		}
		sort(bk, bk + cnt, cmp);
		int mi = 0, ma = 0;
		for(int i = 0; i < cnt - 1; i++)
		{
			if(bk[i].x == bk[i + 1].x)
			{
				mi += get_mi(bk[i + 1].y - bk[i].y - 1);
				ma += get_ma(bk[i + 1].y - bk[i].y - 1);
			}
		}
		printf("Case #%d: %d %d\n", ca, ma, mi);
	}	
}


相關文章