結果
| 問題 | No.19 ステージの選択 |
| コンテスト | |
| ユーザー |
btk
|
| 提出日時 | 2015-05-05 02:41:49 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 1,519 bytes |
| コンパイル時間 | 1,101 ms |
| コンパイル使用メモリ | 114,176 KB |
| 実行使用メモリ | 652,448 KB |
| 最終ジャッジ日時 | 2024-07-05 19:05:45 |
| 合計ジャッジ時間 | 7,720 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 2 WA * 1 MLE * 2 -- * 19 |
ソースコード
#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<utility>
#include<complex>
#include<functional>
using namespace std;
int N, item[100];
vector<list<int> >adj;
vector<vector<int>> group;
void bfs(int s){
bool used[100] = { false };
used[s] = true;
queue<int>que;
que.push(s);
while (que.empty() == false){
int v = que.front(); que.pop();
group[s][v / 25] |= (1 << (v % 25));
for (auto &u : adj[v]){
if (used[u])continue;
used[u] = true;
que.push(u);
}
}
}
int main(void){
map<vector<int>, int> dp;
vector<int> ans(4, 0);
dp[ans] = 0;
int sum = 0;
cin >> N;
adj.resize(N);
group.resize(N);
for (int i = 0; i < N; i++)
{
ans[i / 25] |= (1 << (i % 25));
int p;
cin >> item[i] >> p;
p--;
sum += item[i];
adj[p].push_back(i);
group[i].resize(4);
}
for (int i = 0; i < N; i++){
bfs(i);
map<vector<int>, int> uniq;
for (auto &now : dp){
vector<int> tmp(4, 0);
for (int j = 0; j < 4; j++)tmp[j] = now.first[j] | group[i][j];
if(uniq.count(tmp)==0)uniq[tmp] = now.second + item[i];
else uniq[tmp] = min(uniq[tmp],now.second + item[i]);
}
for (auto &now : uniq){
if (dp.count(now.first) == 0)dp[now.first] = now.second;
else dp[now.first] = min(dp[now.first], now.second);
}
}
cout << dp[ans]+(sum-dp[ans])/2.0 << endl;
return 0;
}
btk