結果
| 問題 |
No.1029 JJOOII 3
|
| コンテスト | |
| ユーザー |
Rho
|
| 提出日時 | 2020-04-16 23:59:44 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 153 ms / 2,000 ms |
| コード長 | 2,166 bytes |
| コンパイル時間 | 1,606 ms |
| コンパイル使用メモリ | 170,724 KB |
| 実行使用メモリ | 197,576 KB |
| 最終ジャッジ日時 | 2024-10-03 04:26:58 |
| 合計ジャッジ時間 | 5,689 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 38 |
ソースコード
#pragma warning(disable:4996)
#include"bits/stdc++.h"
using namespace std;
#define int long long
#define rep(i,n) for(int i=0;i<n;i++)
#define RE assert(0);
const long long inf = 1e17;
string s[82]; int c[82]; int n, K;
int l[3][82];
int dp[3][83][100200];//dp[文字i][j種類][今k文字]
int rwa[3][82][82];
void memo() {
rep(i, 3)rep(j, n + 1)rep(k, 100200)dp[i][j][k] = inf;
rep(i, 3) {
dp[i][0][0] = 0;
rep(j, n) {
rep(k, 100105) {
dp[i][j + 1][k] = dp[i][j][k];
if (k >= l[i][j]) dp[i][j + 1][k] = min(dp[i][j + 1][k], dp[i][j + 1][k - l[i][j]] + c[j]);
}
}
for (int k = 100100; k >= 0; k--)dp[i][n][k] = min(dp[i][n][k], dp[i][n][k + 1]);
}
}
signed main() {
cin.tie(0);
ios::sync_with_stdio(false);
cin >> n >> K;
if (n < 1 || n>80 || K < 1 || K>100000)RE;
int ej = 0, eo = 0, ei = 0;
rep(i, n) {
cin >> s[i] >> c[i];
if (c[i] < 0 || c[i]>1000000000)RE;
if (s[i].size() < 0 || s[i].size() > 80)RE;
rep(j, s[i].size()) {
if (s[i][j] == 'J') {
l[0][i]++;
rwa[0][i][j + 1]++;
}
else if (s[i][j] == 'O') {
l[1][i]++;
rwa[1][i][j + 1]++;
}
else if (s[i][j] == 'I') {
l[2][i]++;
rwa[2][i][j + 1]++;
}
else RE;
}
ej += l[0][i]; eo += l[1][i]; ei += l[2][i];
rep(j, s[i].size()) {
rep(k, 3) {
rwa[k][i][j + 1] += rwa[k][i][j];
}
}
}
if (!ej || !eo || !ei) {
cout << -1 << endl; return 0;
}
memo();
int ans = inf;
rep(i, n) {//文字列1個
rep(j, s[i].size()) {
for (int k = j; k < s[i].size(); k++) {
if (rwa[1][i][k + 1] - rwa[1][i][j] < K)continue;
int jr = max(0ll, K - rwa[0][i][j]);
int ji = max(0ll, K - rwa[2][i][s[i].size()] + rwa[2][i][k + 1]);
ans = min(ans, c[i] + dp[0][n][jr] + dp[2][n][ji]);
}
}
}
rep(i, n) {
rep(j, n) {//文字列2個
rep(k, s[i].size() + 1) {
rep(l, s[j].size() + 1) {
int jr = max(0ll, K - rwa[0][i][k]);
int jo = max(0ll, K - rwa[1][i][s[i].size()] + rwa[1][i][k] - rwa[1][j][l]);
int ji = max(0ll, K - rwa[2][j][s[j].size()] + rwa[2][j][l]);
ans = min(ans, c[i] + c[j] + dp[0][n][jr] + dp[1][n][jo] + dp[2][n][ji]);
}
}
}
}
cout << ans << endl;
}
Rho