이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
using ldouble = long double;
using pli = pair<ldouble, int>;
const int MAX_N = 5e5 + 5;
int n;
ldouble m;
ldouble p[MAX_N], s[MAX_N];
pli a[MAX_N];
struct Answer {
int count;
ldouble sum;
};
bool is_worse(Answer x, Answer y) {
if (x.count == y.count) return x.sum > y.sum;
return x.count < y.count;
}
int main() {
// freopen("hiring.in", "r", stdin), freopen("hiring.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> p[i] >> s[i];
a[i] = {p[i] / s[i], i};
}
sort(a + 1, a + n + 1);
Answer ans = {0, 0};
vector<int> list;
set<pli> ord;
for (int j = 1; j <= n; j++) {
int i = a[j].second;
ord.insert({s[i], i});
Answer new_ans = {0, 0};
vector<int> new_list;
ldouble tar = m / a[j].first;
for (auto it = ord.begin(); it != ord.end(); it++) {
if (new_ans.sum + it->first > tar) break;
new_ans.count++, new_ans.sum += it->first;
new_list.push_back(it->second);
}
new_ans.sum *= a[j].first;
if (is_worse(new_ans, ans)) continue;
ans = new_ans, list = new_list;
}
cout << list.size() << '\n';
for (int x : list) cout << x << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |