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);
}
}