LightOJ - 1016 Brush (II)(贪心)

来源:互联网 发布:炮王 知乎 编辑:程序博客网 时间:2024/06/11 14:33

题目大意:给你一把宽度为w的刷子,每次刷的时候只能横着刷,问需要刷几次才能把所有的点给刷完

解题思路:能并在一起刷,就并在一起刷

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 50010;int y[N];int cnt, n, m, cas = 1;void init() {    scanf("%d%d", &n, &m);    int x;    for (int i = 0; i < n; i++)         scanf("%d%d", &x, &y[i]);    sort(y, y + n);    cnt = 0;    for (int i = 1; i < n; i++)        if (y[i] != y[i - 1])            y[++cnt] = y[i];}int find(int num) {    int l = 0, r = cnt;    while (l <= r) {        int mid = (l + r) >> 1;        if (y[mid] <= num) l = mid + 1;        else r = mid - 1;    }    return r + 1;}void solve() {    int tmp = y[0], ans = 0, pos;    do {        ans++;        pos = find(tmp + m);        tmp = y[pos];    }while (pos <= cnt);    printf("Case %d: %d\n", cas++, ans);}int main() {    int test;    scanf("%d", &test);    while (test--) {        init();        solve();    }    return 0;}
0 0