/*
* poj1230.cpp
*
* Created on: 2010-8-6
* Author: friendy
*/
///贪心,计算出每一列所能遇到的wall的数目,对于每一列,若wall数目小于k则判断下一列,否则
//对这列进行如下操作:找出起点不大于当前列而终点不小于当前列的墙,取其中终点减去当前列最大
//的那面墙,将其删去,(这里是贪心,即去掉对后面影响最大的墙),同时还要更新每一列的墙数
//num[i]的值。
//墙边也算,只要有交集就可以穿墙。如1-2,2-3,就可以穿。
#include
#include
#include
using namespace std;
//贪心贪心贪心
int wal[101][4], p[105];
int n, k;
//按照最左边的点排序
void Sort() {
int i, j;
for (i = 1; i < n; i++) {
for (j = 0; j < n - 1; j++) {
if (wal[j][0] > wal[j + 1][0]) {
int t;
t = wal[j][0];
wal[j][0] = wal[j + 1][0];
wal[j + 1][0] = t;
t = wal[j][2];
wal[j][2] = wal[j + 1][2];
wal[j + 1][2] = t;
}
}
}
}
int main() {
int t, i, j, ans, mmax;
scanf("%d", &t);
while (t--) {
ans = 0;
mmax = -1;
memset(p, 0, sizeof(p));
scanf("%d%d", &n, &k);
for (i = 0; i < n; i++) {//注意输入的时候x坐标大小不一定,所以要比较
scanf("%d%d%d%d", &wal[i][0], &wal[i][1], &wal[i][2], &wal[i][3]);
if (wal[i][0] > wal[i][2]) {
int tmp = wal[i][0];
wal[i][0] = wal[i][2];
wal[i][2] = tmp;
}
if (mmax < wal[i][2])
mmax = wal[i][2];
for (j = wal[i][0]; j <= wal[i][2]; j++)
p[j]++;
}
Sort();
for (i = 0; i <= mmax; i++) {
while (p[i] > k) {
int mMax = -1, pos;
for (j = 0; j < n; j++) {//每次找到左边小于当前列,右边最大的线段
if (wal[j][0] <= i && wal[j][2] >= i && mMax < wal[j][2]) {
mMax = wal[j][2];
pos = j;
}
if(wal[j][0]>i)//因为已经按照左端点排序,如果碰到大于此列的,后面的将会都大于此列
break;
}
for (j = wal[pos][0]; j <= wal[pos][2]; j++) {//更新其他列
p[j]--;
}
ans++;
wal[pos][0] = wal[pos][2] = 0;
}
}
printf("%d/n", ans);
}
return 0;
}
poj1230
最新推荐文章于 2018-09-03 20:07:07 发布