結果
問題 | No.19 ステージの選択 |
ユーザー | Ysmr_Ry |
提出日時 | 2014-11-11 20:19:45 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 1 ms / 5,000 ms |
コード長 | 879 bytes |
コンパイル時間 | 151 ms |
コンパイル使用メモリ | 24,192 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-12-23 10:00:47 |
合計ジャッジ時間 | 1,054 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 24 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:35:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 35 | scanf( "%d", &N ); | ~~~~~^~~~~~~~~~~~ main.cpp:37:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 37 | scanf( "%d%d", L+i, S+i ), L[i]<<=1, --S[i]; | ~~~~~^~~~~~~~~~~~~~~~~~~~
ソースコード
#include<cstdio> #include<cstring> #define rep(i,a) for(int i=0;i<(a);++i) #define clr(a,v) memset((a),(v),sizeof(a)) const int MAX_N = 100; int N; int L[MAX_N], S[MAX_N]; bool used[MAX_N], done[MAX_N]; int dfs( int v, int t ) { if( done[S[v]] ) return -1; if( v == t ) return t; if( used[S[v]] ) return -1; used[v] = true; int ret = dfs( S[v], t ); if( ret < 0 ) return -1; if( L[v] < L[ret] ) return v; return ret; } int main() { scanf( "%d", &N ); rep( i, N ) scanf( "%d%d", L+i, S+i ), L[i]<<=1, --S[i]; int ans = 0; rep( i, N ) if( !done[i] ) { clr( used, false ); int res = dfs( S[i], i ); if( res >= 0 ) ans += L[res], done[res] = true; } rep( i, N ) rep( j, N ) if( done[S[j]] && !done[j] ) done[j] = true, ans += L[j]>>1; printf( "%.1f\n", ans/2.0 ); return 0; }