我在topcoder中的SnapDragon解决方案中多次观察到这一行 ret http://community.topcoder.com/stat?c=problem_solution&rm=166781&rd=5865&pm=3115&cr=272072。上面一行从底部出现在第6行。 这是代码
vector<string> tokenize(string s, string ch) {
vector<string> ret;
for( int p = 0, p2; p < s.size(); p = p2+1 ) {
p2 = s.find_first_of(ch, p);
if( p2 == -1 ) p2 = s.size();
if( p2-p > 0 ) ret.push_back( s.substr(p, p2-p) );
}
return ret;
}
vector<int> tokint(string s, string ch) {
vector<int> ret;
vector<string> p = tokenize(s, ch);
for( int i = 0; i < p.size(); i++ )
ret.push_back( atoi(p[i].c_str()) );
return ret;
}
vector<vector<int> > tokmat(vector<string> s, string ch) {
vector<vector<int> > ret;
for( int i = 0; i < s.size(); i++ )
ret.push_back( tokint(s[i], ch) );
return ret;
}
int pref[15][30];
class OrderFood {
public:
int selectEntrees(vector <int> a, vector <string> b) {
int i, j, k, x, y, z, n;
VVI t = tokmat(b, " ");
for( i = 0; i < t.size(); i++ )
for( j = 0; j < t[i].size(); j++ )
pref[i][t[i][j]] = 1;
n = a.size()/2;
map<VI, int> m;
for( i = 0; i < (1<<n); i++ ) {
VI v(t.size());
for( j = 0; j < n; j++ ) if( i&(1<<j) )
for( k = 0; k < t.size(); k++ )
v[k] += pref[k][j];
for( j = 0; j < t.size(); j++ ) if( v[j] > 2 ) break;
if( j < t.size() ) continue;
x = 0;
for( j = 0; j < n; j++ ) if( i&(1<<j) )
x += a[j];
if( m.count(v) )
m[v] <?= x;
else
m[v] = x;
}
int n2 = a.size()-n;
int ret = 1000000000;
for( i = 0; i < (1<<n2); i++ ) {
VI v(t.size(), 2);
for( j = 0; j < n2; j++ ) if( i&(1<<j) )
for( k = 0; k < t.size(); k++ )
v[k] -= pref[k][j+n];
for( j = 0; j < t.size(); j++ ) if( v[j] < 0 ) break;
if( j < t.size() ) continue;
x = 0;
for( j = 0; j < n2; j++ ) if( i&(1<<j) )
x += a[j+n];
if( !m.count(v) ) continue;
ret <?= x + m[v];
}
if( ret == 1000000000 ) return -1;
return ret;
}
};
答案 0 :(得分:11)
<?=
运算符是最小运算符,>?=
是最大运算符。这两者都是非标准的GCC扩展。 a<?=b
是a=min(a,b)
。使用a=min(a,b)
代替此。它更具可读性,并且跨平台工作更好
答案 1 :(得分:0)
operator<?=
是GCC extension。在您的示例中,它将ret
设置为ret
和x + m[v]
的最小值。
这不是标准运算符,因此不能移植到不同的编译器。