結果
| 問題 |
No.1029 JJOOII 3
|
| コンテスト | |
| ユーザー |
chocorusk
|
| 提出日時 | 2020-04-17 22:04:22 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,404 bytes |
| コンパイル時間 | 1,988 ms |
| コンパイル使用メモリ | 126,560 KB |
| 最終ジャッジ日時 | 2025-01-09 20:04:20 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 WA * 8 |
ソースコード
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <cassert>
#include <fstream>
#include <utility>
#include <functional>
#include <time.h>
#include <stack>
#include <array>
#define popcount __builtin_popcount
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
int main()
{
int n, k;
cin>>n>>k;
string s[80];
ll v[80];
int c[80][3]={};
int cc[80][81][3]={};
for(int i=0; i<n; i++){
cin>>s[i]>>v[i];
for(int j=0; j<s[i].size(); j++){
for(int l=0; l<3; l++) cc[i][j+1][l]=cc[i][j][l];
if(s[i][j]=='J') c[i][0]++, cc[i][j+1][0]++;
else if(s[i][j]=='O') c[i][1]++, cc[i][j+1][1]++;
else c[i][2]++, cc[i][j+1][2]++;
}
}
const ll INF=1e18;
ll dp[3][100010];
for(int i=0; i<3; i++){
for(int l=0; l<=k; l++) dp[i][l]=INF;
dp[i][0]=0;
for(int j=0; j<n; j++){
for(int l=0; l<=k; l++){
dp[i][min(k, l+c[j][i])]=min(dp[i][min(k, l+c[j][i])], dp[i][l]+v[j]);
}
}
}
ll ans=INF;
for(int i=0; i<n; i++){
if(c[i][1]<k) continue;
for(int j=0; j<s[i].size(); j++){
if(s[i][j]!='O') continue;
int r=j;
int cnt=0;
while(r<s[i].size()){
if(s[i][r]=='O') cnt++;
if(cnt==k) break;
r++;
}
if(r==s[i].size()) continue;
int cnt0=0, cnt2=0;
for(int l=0; l<j; l++) if(s[i][l]=='J') cnt0++;
for(int l=r+1; l<s[i].size(); l++) if(s[i][l]=='I') cnt2++;
ans=min(ans, dp[0][max(0, k-cnt0)]+dp[2][max(0, k-cnt2)]+v[i]);
}
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
for(int p=0; p<=s[i].size(); p++){
for(int q=0; q<=s[j].size(); q++){
ans=min(ans, v[i]+v[j]+dp[0][max(0, k-cc[i][p][0])]+dp[1][max(0, k-(c[i][1]-cc[i][p][1])-cc[j][q][1])]+dp[2][max(0, k-(c[j][2]-cc[j][q][2]))]);
}
}
}
}
if(ans>=INF/2) cout<<-1<<endl;
else cout<<ans<<endl;
return 0;
}
chocorusk