题目链接 http://acm.hust.edu.cn/vjudge/problem/19688
解题思路
区间的最小覆盖问题
代码
#include<stdio.h> #include<string.h> #include<algorithm> #define MAX_LEN 100050 using namespace std; typedef struct line { int l, r; }Line; Line lines[MAX_LEN]; Line cpy[MAX_LEN]; Line ans[MAX_LEN]; int m, n; bool compare(Line x, Line y) { return x.l<y.l; } void Solve() { int start=0, ansp=0; int j=0; bool flag = true; while(j<n) { for(int i=j; i<n; i++) { cpy[i] = lines[i]; if(cpy[i].l<start) cpy[i].l = start; } int maxr=0, now = -1; while(j<n && cpy[j].l==start) { if(cpy[j].r == start) { j++; continue; } else if(cpy[j].r > maxr) { maxr = cpy[j].r; now=j; j++; } else j++; } // if(j<n && cpy[j].l!=start) j++; if(now!=-1) { start = lines[now].r; ans[ansp++] = lines[now]; } else { flag = false; break; } if(maxr>=m) break; } if(flag) { printf("%d\n", ansp); for(int i=0; i<ansp; i++) printf("%d %d\n", ans[i].l, ans[i].r); } else printf("0\n"); } int main() { int cases; scanf("%d", &cases); while(cases--) { scanf("%d", &m); int l, r; char ch; n = 0; scanf("%d%d", &l, &r); while(!(l==0&&r==0)) { lines[n].l = l; lines[n].r = r; n++; scanf("%d%d", &l, &r); } sort(lines, lines+n, compare); Solve(); if(cases) printf("\n"); } return 0; }
时间: 2024-10-08 12:19:15