/* * 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 发布