您的位置:首页 > 其它

【TOJ 3585】Covering the Corral【贪心】

2014-09-06 20:35 417 查看
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100004

struct Li{
int s, e;
bool operator<(Li a) const {
if (a.s == s) return e < a.e;
return s < a.s;
}
}l
;

bool vis
;
int cnt
, r
;

int main() {
int c, n, i, j, ans, k;
while (~scanf("%d%d", &c, &n)) {
ans = n;
for (i = 0;i < n;i++) {
scanf("%d%d", &l[i].s, &l[i].e);
l[i].e += l[i].s;
}
memset(vis, false, sizeof(vis));
sort(l, l+n);
int m = 0;
for (i = 0;i < n-1;i++) if (l[i].s == l[i+1].s) vis[i] = true;
for (i = 0;i < n;i++) {
if (vis[i]) continue;
for (j = i+1;j < n;j++) {
if (l[j].s >= l[i].s && l[j].e <= l[i].e) vis[j] = true;
if (l[j].s > l[i].e) break;
}
}
for (i = 0;i < n;i++) {
if (!vis[i]) l[m++] = l[i];
}
n = m;
for (i = n-1, j = n-1;i >= 0;i--) {
while (l[j].s > l[i].e && j > 0) j--;
r[i] = j;
}
for (i = n-1;i >= 0;i--) {
if (l[i].e < c) break;
if (l[i].e-l[i].s >= c) {
ans = 1;
break;
}
cnt[i] = 1;
for (j = i-1;j >= 0;j--) {
cnt[j] = cnt[r[j]]+1;
if (l[i].e-l[j].s >= c && ans > cnt[j]) {
ans = cnt[j];
break;
}
}
}
printf("%d\n", ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: