[コードレビュー]
/*
CAUTION:
再度AtCoderで試してみて、それでもだめなら"todo:" の部分を修正してみて、
それでもだめなら質問する
*/
私は趣味でC++やっています。
AtCoderに挑戦中なのですが、わからないところがあります。
Searching:bit全探索 → C - Skill Up
をやってみました。
「bit全探索」を使うそうなのでbit全探索の基本的な部分を学んで試してみました。
ですが、なぜか常にエラーです。
自分のPC上で MinGW を使ってコンパイルし、試してみると問題文にある出力例と一致します。
ですが提出するとなぜか最初のテストが失敗します。
自分なりのコード:
C++
1#include<iostream> 2#include<vector> 3#include<cstring> 4#include<sstream> 5#include<algorithm> 6#include<iomanip> 7 8using std::cout; 9using std::endl; 10using std::flush; 11using std::cin; 12 13namespace Util{ 14 using StringVector = std::vector<std::string>; 15 16 /* 17 @ 目的: 文字列分割 18 */ 19 StringVector split( const std::string &s, const std::string &delim = std::string(" ") ){ 20 const int len = s.size(); 21 char tmp[len+1]; 22 strcpy( tmp, s.c_str() ); 23 24 std::vector<std::string> res; 25 26 char *tmpStr = std::strtok( tmp, delim.c_str() ); 27 if( tmpStr == NULL ) return res; 28 29 while( tmpStr != NULL ){ 30 //cout << tmpStr << endl; 31 res.push_back( tmpStr ); 32 tmpStr = NULL; 33 tmpStr = std::strtok( NULL, " " ); 34 } 35 return res; 36 } 37 38 /* 39 @ 目的: 数字等を文字列に固める 40 */ 41 template<typename T> 42 std::string toString( T data, int width = 0 ){ 43 std::stringstream ss; 44 ss << std::setw(width) << data; 45 return ss.str(); 46 } 47 template<> std::string toString( bool flg, int width ){ 48 if( width == 1 && flg ) return std::string("T"); 49 if( width == 1 && !flg ) return std::string("F"); 50 if( flg ) return std::string("true"); 51 return std::string("false"); 52 } 53} 54 55 56namespace Original{ 57 using Data = std::vector<int>; 58 using Table = std::vector< Data >; 59} 60 61int main( void ){ 62 cin.tie(0); 63 std::ios::sync_with_stdio(false); 64 65 // めちゃくちゃな値をセットしておく 66 const int INF = 100001; 67 68 // n, m, x をそれぞれ取得 69 std::string tmpNum; 70 std::getline( cin, tmpNum ); 71 Util::StringVector t = Util::split( tmpNum ); 72 int n = std::atoi( t[0].c_str() ); 73 int m = std::atoi( t[1].c_str() ); 74 int x = std::atoi( t[2].c_str() ); 75 76 // テーブルとして取得( 二次元配列風 ) 77 Original::Table table; 78 for( int i = 0; i < n; i++ ){ 79 std::string s; 80 getline( cin, s ); 81 Util::StringVector sv = Util::split( s ); 82 Original::Data d; 83 for( int j = 0; j < m+1; j++ ){ 84 d.push_back( std::atoi( sv[j].c_str() ) ); 85 } 86 table.push_back( d ); 87 } 88 89 // 初期値は INFとする 90 int ans = INF; 91 92 // bit全探索 93 for( int bit = 0; bit < (1 << n); bit++ ){ 94 std::vector<int> vec(m+1,0); 95 for( int i = 0; i < n; i++ ){ 96 if( (bit >> i) & 1 ){ 97 vec[0] += table[i][0]; 98 for( int j = 1; j <= m; j++ ) vec[j] += table[i][j]; 99 } 100 } 101 102 bool isAllowed = true; 103 for( int i = 1; i <= m; i++ ){ 104 // todo: もしエラーなら "<=" とかにしてみる 105 if( vec[i] < x ){ isAllowed = false; break; } 106 } 107 108 if( isAllowed ) ans = std::min( ans, vec[0] ); 109 } 110 111 if( ans == INF ) cout << -1 << endl; 112 else cout << ans << endl; 113return 0; 114}
MinGW上でも失敗するのならわかりますが、MinGWでは成功するがAtCoderでは失敗するのが…不明…
(どこか間違っている気がするが…自分の凝り固まった頭では見つけられない…)
もちろんデバッガ(GDB)を使ってデバッグもしてみました。
ですがそれでも原因が見つからず…
AtCoder内にある、実装例のコードを参照してみましたが、発想自体は大体同じで、単に
{ コスト, Alg1, Alg2, Alg3 ... } という風にレコード(?)を抽出するのか、
cost と { Alg1, Alg2, Alg3 ... } という風に 分離するのかの違いしかないようです。
なぜこんなにも差が出るのでしょうか…
コードレビュー、お願いします…
[情報]
言語: C++
(PC上の)コンパイラ: MinGW
AtCoder上で試したコンパイラ: // todo: ここに記述
値: { border1,2 とhand3, large4-8 } が WA になる
回答1件
あなたの回答
tips
プレビュー