結果
| 問題 |
No.1029 JJOOII 3
|
| コンテスト | |
| ユーザー |
Rho
|
| 提出日時 | 2020-04-16 20:37:55 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,952 bytes |
| コンパイル時間 | 1,855 ms |
| コンパイル使用メモリ | 172,692 KB |
| 実行使用メモリ | 194,000 KB |
| 最終ジャッジ日時 | 2024-10-02 08:49:28 |
| 合計ジャッジ時間 | 8,525 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 25 WA * 13 |
ソースコード
#include"bits/stdc++.h"
using namespace std;
#define int long long
#define rep(i,n) for(int i=0;i<n;i++)
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] = min(dp[i][j][k], dp[i][j + 1][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]);
}
}
rep(k, 100100)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;
int ej = 0, eo = 0, ei = 0;
rep(i, n) {
cin >> s[i] >> c[i];
rep(j, s[i].size()) {
if (s[i][j] == 'J') {
l[0][i]++;
rwa[0][i][j + 1]++;
}
if (s[i][j] == 'O') {
l[1][i]++;
rwa[1][i][j + 1]++;
}
if (s[i][j] == 'I') {
l[2][i]++;
rwa[2][i][j + 1]++;
}
}
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