TopCoder SRM 572 NextOrPrev
本番ではiとjの間違いで死んだ。
条件がすごい厄介
class NextOrPrev { public: int getMinimum(int nextCost, int prevCost, string start, string goal) { vector<pair<char,char> > up; vector<pair<char,char> > down; vector<char> non; for(int i=0;i<start.size();i++){ if(start[i] == goal[i]) non.push_back(start[i]); else if(start[i] < goal[i]) up.push_back(mp(start[i],goal[i])); else down.push_back(mp(start[i],goal[i])); } bool ok = true; sort(all(up)); for(int i=1;i<up.size();i++){ if(up[i].second < up[i-1].second) ok = false; } sort(rall(down)); for(int i=1;i<down.size();i++){ if(down[i].second > down[i-1].second) ok = false; } for(int j=0;j<non.size();j++){ for(int i=0;i<up.size();i++){ if(up[i].first < non[j] and non[j] < up[i].second) ok = false; } for(int i=0;i<down.size();i++){ if(down[i].second < non[j] and non[j] < down[i].first) ok = false; } } for(int i=0;i<up.size();i++){ for(int j=0;j<down.size();j++){ char a = up[i].first; char b = up[i].second; char c = down[j].second; char d = down[j].first; if(a <= c and c <= b) ok = false; if(a <= d and d <= b) ok = false; if(c <= a and a <= d) ok = false; if(c <= b and b <= d) ok = false; } } if(ok){ int ret = 0; for(int i=0;i<up.size();i++){ ret += (up[i].second - up[i].first) * nextCost; } for(int i=0;i<down.size();i++){ ret += (down[i].first - down[i].second) * prevCost; } return ret; }else{ return -1; } } };