貪欲なG-木製スティック

G-木の棒

タイトルリンク:HDU1051
ここに写真の説明を挿入

回答

アイデア

タイトルには必要最小限の時間が必要です。
前のものより長くて重いことに満足できない木の棒は処理時間が1分長くなることを知っているので、木の棒をいくつかの山に分割する必要があり、木の棒の山は前のものよりも重くて重いという要件を満たします。長いです。そのような山の数が処理時間です。

成し遂げる

実際、上記のプロセスを完全にシミュレートする必要はありません。最初のキーワードとして長さ、2番目のキーワードとして重みを使用して、スティックを昇順で並べ替えるだけです。現在の木の棒が処理されたかどうかを示す
アクセス配列vis作成します
スティックごとに、トラバーサルが完了して次のスティックが開始されるまで、長くて重いスティックを繰り返し見つけます。
スティックを開始するたびに、時間が1つずつ増加します。

ACコード

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>

using namespace std;
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
#define mmc(a, b) memcpy(a, b, sizeof(b))
#define INF (0x3f3f3f3f)
#define mod (ull)(1e9+7)
typedef pair<int, int> P;

namespace FastIO {
    const int bufsiz = 1 << 22;
    char buf[bufsiz];

    inline char getch() {
        static int tot;
        tot++;
        if (tot == bufsiz) {
            fread(buf, 1, bufsiz, stdin);
            tot = 0;
        }
        return buf[tot];
    }

    inline int read() {
        int x = 0;
        char c = getch();
        while (!isdigit(c))c = getch();
        while (isdigit(c))x = x * 10 + c - '0', c = getch();
        return x;
    }
}
using FastIO::read;
// length weight
vector<P> v(5010);
int vis[5010];

bool cmp(const P &a, const P &b) {
    if (a.first < b.first) return true;
    else return a.first == b.first && a.second <= b.second;
}

int main() {
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    int T = read();
//    scanf("%d", &T);
    while (T--) {
        mms(vis, 0);
        int x = read();
        rep(i, 1, x) {
            v[i].first = read();
            v[i].second = read();
        }
        sort(v.begin() + 1, v.begin() + x + 1, cmp);
        int ans = 1;
        int l, w;
        vis[1] = 1;
        rep(i, 1, x) {
            if (i == 1) l = v[1].first, w = v[1].second;
            else if (vis[i] == 0) {
                l = v[i].first, w = v[i].second;
                ans++;
            } else if (vis[i] == 1) continue;
            rep(j, i + 1, x) {
                if (vis[j]) continue;
                if (l <= v[j].first && w <= v[j].second) {
                    l = v[j].first, w = v[j].second;
                    vis[j] = 1;
                }
            }
        }
        printf("%d\n", ans);
    }
}

おすすめ

転載: blog.csdn.net/qq_45934120/article/details/107693992
おすすめ