結果
| 問題 |
No.19 ステージの選択
|
| ユーザー |
|
| 提出日時 | 2014-10-09 16:55:13 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 5,000 ms |
| コード長 | 1,269 bytes |
| コンパイル時間 | 1,246 ms |
| コンパイル使用メモリ | 78,792 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-23 10:00:33 |
| 合計ジャッジ時間 | 1,701 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 |
ソースコード
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
#define REP(i, n) for(int(i)=0;(i)<(n);++(i))
void rc(int v,int mn,int mx){if(v<mn||mx<v){cerr<<"error"<<endl;}}
int N;
int L[101], S[101];
bool f[101];
const int INF = 1<<29;
int check(int i, vector<int> &v){
set<int> s;
s.insert(i);
while(1){
i = S[i];
if(s.count(i)){
v.insert(v.end(), s.begin(), s.end());
return i;
}
s.insert(i);
}
}
int main(){
cin >> N; rc(N,1,100);
REP(i,N){
cin >> L[i] >> S[i]; rc(L[i],1,100); rc(S[i],1,N);
L[i]*=2;
S[i]--;
}
int total = 0;
REP(i,N){
if(f[i]) continue;
vector<int> v;
int ret = check(i, v);
if(ret != i){
total += L[i]/2;
f[i] = true;
} else {
int s = v.size();
int minv = INF;
REP(j,s){
total += L[v[j]]/2;
minv = min(minv, L[v[j]]);
f[v[j]] = true;
}
total += minv/2;
}
}
cout << fixed << setprecision(1) << total/2.0 << endl;
return 0;
}