poj1230

/* * 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; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值