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;
	}
};