poj1230

来源:互联网 发布:愉此一生网络剧播放 编辑:程序博客网 时间:2024/06/02 00:19
/* * poj1230.cpp * * Created on: 2010-8-6 * Author: friendy *////贪心,计算出每一列所能遇到的wall的数目,对于每一列,若wall数目小于k则判断下一列,否则//对这列进行如下操作:找出起点不大于当前列而终点不小于当前列的墙,取其中终点减去当前列最大//的那面墙,将其删去,(这里是贪心,即去掉对后面影响最大的墙),同时还要更新每一列的墙数//num[i]的值。//墙边也算,只要有交集就可以穿墙。如1-2,2-3,就可以穿。#include#include#includeusing 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;}