[UVA 10020] Minimal coverage

2017年9月7日

选用尽可能少的线段来覆盖一个 [0, m] 的区间。

贪心。

#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
struct line {
  int l, r;
  bool operator < (const line &op) const {
    return l < op.l || l == op.l && r > op.r;
  }
} e[N], ans[N];
int main()
{
  int t;
  scanf("%d", &t);
  for (int cas = 0; cas < t; cas++) {
    if (cas)
      puts("");
    int m;
    scanf("%d", &m);
    int n = 0;
    while (~scanf("%d %d", &e[n].l, &e[n].r)) {
      if (e[n].l == 0 && e[n].r == 0)
        break;
      n++;
    }
    sort(e, e + n);
    int l = 0, cnt = 0;
    for (int i = 0; i < n && l < m;) {
      int r = -1, p;
      while (e[i].l <= l && i < n) {
        if (r < e[i].r) {
          p = i;
          r = e[i].r;
        }
        i++;
      }
      if (r == -1) {
        break;
      }
      l = r;
      ans[cnt++] = e[p];
    }  
    if (l < m) {
      printf("0\n");
      continue;
    }
    printf("%d\n", cnt);
    for (int i = 0; i < cnt; i++) {
      printf("%d %d\n", ans[i].l, ans[i].r);
    }
  }
  return 0;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注