cafelier のSRM参加記録です。コンテスト中に考えてたことを執拗に全部書き残すとどうなるだろうかという試み本番中にこういうコードが書きたかったなあ、という後で書いた反省コードを書き残す試み
スパムが来たのでしばらくコメント欄をはてなユーザ限定にしています、すみません、
あとで | |
typedef complex<double> CMP; double outer_prod(const CMP& a, const CMP& b) { return imag(conj(a)*b); } double inner_prod(const CMP& a, const CMP& b) { return real(conj(a)*b); } int ccw(const CMP& a, CMP b, CMP c) { b -= a; c -= a; if( outer_prod(b,c) > 0 ) return +1; // counter clockwise if( outer_prod(b,c) < 0 ) return -1; // clockwise if( inner_prod(b,c) < 0 ) return +2; // c--[a--b] on line if( norm(b) < norm(c) ) return -2; // [a--b]--c on line return 0; // [a--c--b] on line } class TimeTravellingGardener { public: int determineUsage(vector <int> distance, vector <int> height) { const int N = height.size(); distance.insert(distance.begin(), 0); partial_sum(distance.begin(), distance.end(), distance.begin()); vector<CMP> p; for(int i=0; i<N; ++i) p.push_back( CMP(distance[i], height[i]) ); int best = N-1; for(int i=0; i<N; ++i) for(int j=i+1; j<N; ++j) { best = min(best, score(p[i], p[j], p)); best = min(best, score(p[i].real(), p[j], p)); best = min(best, score(p[i], p[j].real(), p)); } return best; } int score(const CMP& a, const CMP& b, const vector<CMP>& p) { int s = 0; for(int i=0; i<p.size(); ++i) { if( ccw(a, b, p[i]) == -1 ) return INT_MAX; if( ccw(a, b, p[i].real()) == +1 ) return INT_MAX; if( ccw(a, b, p[i]) == +1 ) ++s; } return s; } };
presented by cafelier/k.inaba under