SRM 572 Div2
742 -> 933 (+191)
緑色になりました。
easyをdoubleで計算していた人がいて、1000000000を49個ぐらい並べてオバーフローさせた後で0を入れるとinf*0=nanみたいになる仕様を利用して撃墜しました。
easy
0があるかないかと、負の数の個数を数える
#include <cstdio> #include <algorithm> #include <string> #include <vector> using namespace std; class EasyHomework{ public: string determineSign(vector <int> A){ bool f = false; int neg = 0; for(int i = 0; i < A.size(); i++){ if(A[i] == 0) f = true; if(A[i] < 0) neg++; } if(f){ return string("ZERO"); }else if(neg % 2 == 0){ return string("POSITIVE"); } return string("NEGATIVE"); } };
med
任意の2文字のstartとgoalについて交差していないかどうかを判定した後、貪欲風に計算する
#include <cstdio> #include <algorithm> using namespace std; class NextOrPrev{ public: int getMinimum(int nextCost, int prevCost, String start, String goal){ int abc[26]; bool f = false; for(int i = 0; i < start.size(); i++){ int si = start[i] - 'A'; int gi = goal[i] - 'A'; for(int j = i + 1; j < start.size(); j++){ int sj = start[j] - 'A'; int gj = goal[j] - 'A'; if(si > sj && gi < gj || si < sj && gi > gj) f = true; } if(f) return -1; } int ans = 0; for(int i = 0; i < start.size(); i++){ int d = goal[i] - start[i]; if(d < 0){ ans += prevCost * (-d); }else{ ans += nextCost * d; } } return ans; } };