uvalive 2326 - Moving Tables(区间覆盖问题)

题目连接:2326 - Moving Tables


题目大意:在一个走廊上有400个教室, 先在有一些桌子要移动, 每次移动需要十分钟, 但是不同房间的桌子可以在同一个十分钟内移动,只要走廊没有被占用就可以, 注意教室序号1 和 2 是在对面。


注意:给出的区间没有分左边或者是右边比较大。

解题思路:区间覆盖问题, 将所有给出的区间处理一下, 去除对面房间这样的情况。 让后将区间按照l 和 r 的值进行排序, 然后看进行几次区间覆盖可以使得所有区间均被用上。


 

#include <stdio.h>

#include <string.h>

#include <algorithm>

using namespace std;

const int N = 205;



struct thing {

    int l;

    int r;

}tmp[N];



bool cmp(const thing& a, const thing& b) {

    if (a.l != b.l) return a.l < b.l;

    else    return a.r <  b.r;

}



int main() {

    int cas, n, L, R, vis[N];

    scanf("%d", &cas);

    while (cas--) {

	int ti = 0, cnt = 0;

	memset(vis, 0, sizeof(vis));

	

	scanf("%d", &n);

	for (int i = 0; i < n; i++) {

	    scanf("%d%d", &L, &R);

	    if (L > R) {

		int t = R;

		R = L;

		L = t;

	    }

	    tmp[i].l = (L + 1) / 2;

	    tmp[i].r = (R + 1) / 2;

	}



	sort(tmp, tmp + n, cmp);



	while (cnt < n) {

	    ti++;

	    int begin = 0;

	    for (int i = 0; i < n; i++) {

		if (vis[i]) continue;

		if (tmp[i].l > begin) {

		    begin = tmp[i].r;

		    cnt++;

		    vis[i] = 1;

		}

	    }

	}



	printf("%d\n", ti * 10);

	

    }

    return 0;

}


 

 

你可能感兴趣的:(table)