結果
| 問題 |
No.1029 JJOOII 3
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-04-18 02:42:20 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,542 bytes |
| コンパイル時間 | 2,062 ms |
| コンパイル使用メモリ | 102,584 KB |
| 最終ジャッジ日時 | 2025-01-09 21:04:57 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 WA * 3 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <numeric>
#include <deque>
using namespace std;
typedef long long int ll;
ll dp[3][100010];
ll cnt[3][85];
int f(char c){
if(c=='J')return 0;
else if(c=='O')return 1;
else return 2;
}
int main(){
cin.tie(nullptr);
ios::sync_with_stdio(false);
int n,k; cin >> n >> k;
for(int i=0;i<3;i++){
for(int j=0;j<=k;j++){
dp[i][j]=2e18;
}
}
dp[0][0]=dp[1][0]=dp[2][0]=0;
vector<string> s(n);
vector<ll> c(n);
for(int i=0;i<n;i++){
cin >> s[i] >> c[i];
for(char c:s[i]){
cnt[f(c)][i]++;
}
}
for(int i=0;i<3;i++){
for(ll j=0;j<=k;j++){
for(int p=0;p<n;p++){
dp[i][min(j+cnt[i][p],(ll)k)]=min(dp[i][min(j+cnt[i][p],(ll)k)],dp[i][j]+c[p]);
}
}
}
for(int i=0;i<3;i++){
for(int j=k;j>0;j--){
dp[i][j-1]=min(dp[i][j],dp[i][j-1]);
}
}
ll res=2e18;
if(dp[0][1]==2e18||dp[1][1]==2e18||dp[2][1]==2e18){
printf("-1\n");
return 0;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int J=0,O=cnt[1][i]+cnt[1][j],I=0;
res=min(res,dp[0][max(0,k-J)]+c[i]+c[j]+dp[1][max(0,k-O)]+dp[2][max(0,k-I)]);
for(int p=0;p<s[i].size();p++){
for(int q=0;q<s[j].size();q++){
if(s[j][s[j].size()-1-q]=='O'){
O--;
}
else if(s[j][s[j].size()-1-q]=='I'){
I++;
}
res=min(res,dp[0][max(0,k-J)]+c[i]+c[j]+dp[1][max(0,k-O)]+dp[2][max(0,k-I)]);
}
O+=cnt[1][j];
I=0;
if(s[i][p]=='J'){
J++;
}
else if(s[i][p]=='O'){
O--;
}
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<s[i].size();j++){
int cnt=0;
int J=0;
int I=0;
for(int p=0;p<j;p++){
if(s[i][p]=='J')j++;
}
for(int p=j;p<s[i].size();p++){
if(s[i][p]=='O')cnt++;
if(cnt>=k&&s[i][p]=='I')I++;
}
if(cnt<k)continue;
res=min(res,dp[0][max(0,k-J)]+c[i]+dp[2][max(0,k-I)]);
}
}
printf("%lld\n",res);
}