随手练——HDU-2037 、P-2920 时间安排(贪心)

  • 普通时间安排

HDU-2037 :http://acm.hdu.edu.cn/showproblem.php?pid=2037

选取结束时间早的策略。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

class T {
public:
    int start, end;
    T(int s, int e) {
        start = s; end = e;
    }
    bool operator<(T t)const {
        return end < t.end;
    }
};

int main() {
    int n, c1, c2;
    vector<T>v;
    while (cin >> n) {
        if (n == 0)break;
        while (n--) {
            cin >> c1 >> c2;
            v.push_back(T(c1, c2));
        }

        sort(v.begin(), v.end());
        int res = 1; int end = v[0].end;
        for (int i = 1; i < v.size(); i++) {
            if (v[i].start >= end) {
                res++;
                end = v[i].end;
            }
        }
        cout << res << endl;
        v.clear();
    }
    return 0;
}
  •  时间管理升级1

洛谷:https://www.luogu.org/problemnew/show/P2920

思想和第一个差不多,稍微绕了一点小弯,这题装 vector 再做就超时了,能简尽量不要复杂。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class TIME {
public:
    int t_s, t_e;
}T[1001];
int cmp(TIME t1, TIME t2) {
    return t1.t_e < t2.t_e ? 1 : 0;
}
int main() {
    int N;
    cin >> N;
    for (int i = 0; i < N;i++) {
        cin >> T[i].t_s >> T[i].t_e;
        T[i].t_s = T[i].t_e - T[i].t_s;
    }
    sort(T, T + N, cmp);
        int i = 1;
        while (i < N) {
            if (T[i].t_s < T[i - 1].t_e) {
                while (T[i].t_s < T[i - 1].t_e) {
                    T[i].t_s++;
                    T[0].t_s--;
                }
                if (T[0].t_s < 0)
                break;
            }    
            else {
                while (T[i].t_s != T[i-1].t_e) {
                    T[i].t_s--;
                    T[i].t_e--;
                }
                i++;
            }
        }
        if (T[0].t_s < 0 || i != N)cout << -1 << endl;
        else cout << T[0].t_s << endl;    
    return 0;
}

 

posted @ 2019-02-08 21:52  czc1999  阅读(79)  评论(0编辑  收藏  举报