QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#60595 | #2544. Flatland Currency | 12345678 | WA | 2ms | 3524kb | C++14 | 2.6kb | 2022-11-05 17:19:27 | 2022-11-05 17:19:28 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mp make_pair
#define inf 1e18
#define pii pair <int, int>
const int mod = 1e9 + 7;
int read () {
int x = 0, f = 1;
char ch = getchar ();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar ();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar ();
}
return x * f;
}
void write (int x) {
if (x < 0) x = -x, putchar ('-');
if (x >= 10) write (x / 10);
putchar (x % 10 + '0');
}
int quickmod (int x, int y) {
int Ans = 1;
while (y) {
if (y & 1) Ans = (Ans * x) % mod;
x = (x * x) % mod;
y >>= 1;
}
return Ans;
}
int n, m;
int a[100005];
vector <int> G[5];
int f[400005][5];
inline int get_val(int k, int x) {
if(!x) return 0;
if(x > (int)G[k].size()) return inf;
return G[k][x-1];
}
vector <int> Lst[5];
void solve(int k2, int k, int l, int r, int L, int R) {
if(l > r) return ;
int mid = (l + r) / 2, Mid = L;
f[Lst[k2][mid]][k] = inf;
for(int i = L; i <= min(mid, R); i++) {
int lst = mid - i;
if(f[Lst[k2][i]][k-1] + get_val(k, lst) < f[Lst[k2][mid]][k]) {
f[Lst[k2][mid]][k] = f[Lst[k2][i]][k-1] + get_val(k, lst);
Mid = i;
}
}
solve(k2, k, l, mid - 1, L, Mid), solve(k2, k, mid + 1, r, Mid, R);
}
signed main () {
// freopen (".in", "r", stdin);
// freopen (".out", "w", stdout);
n = read(), m = read();
int bas = m % 5;
m -= bas;
for(int i = 1; i <= n; i++) {
a[i] = read();
G[5-a[i]%5].push_back(a[i]);
}
for(int i = 0; i < 5; i++) {
sort(G[i].begin(), G[i].end());
for(int j = 1; j < (int)G[i].size(); j++) G[i][j] += G[i][j-1];
}
f[0][0] = 0;
for(int i = 1; i <= 4 * n; i++) f[i][0] = inf;
for(int i = 1; i < 5; i++) {
// for(int j = 0; j <= 4 * n; j++) {
// f[j][i] = inf;
// for(int k = 0; k <= j; k++) {
// int lst = (j - k + (i - 1)) / i;
// if(f[k][i-1] + get_val(i, lst) < f[j][i]) {
// f[j][i] = f[k][i-1] + get_val(i, lst);
// }
// }
// }
for(int j = 0; j < i; j++) Lst[j].clear();
for(int j = 0; j <= 4 * n; j++) Lst[j%i].push_back(j);
for(int j = 0; j < i; j++) solve(j, i, 0, (int)Lst[j].size() - 1, 0, (int)Lst[j].size() - 1);
}
int Ans = 0;
for(int i = 0; i <= 4 * n; i++) if(f[i][4] <= m) Ans = i;
write(Ans + bas), putchar('\n');
return 0;
}
/*
5 57
9 14 31 18 27
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 3424kb
input:
5 57 9 14 31 18 27
output:
8
result:
ok answer is '8'
Test #2:
score: -100
Wrong Answer
time: 2ms
memory: 3524kb
input:
4 50 11 11 11 11
output:
16
result:
wrong answer expected '12', found '16'