SRM314 div2

easy

//計算量を下げるなら、vector<pii>とかで格納しておくのがよい。普通にやると、4じゅうるーぷとかなった、
  int dissatisfaction(vector <string> farmland) {
    int row = farmland.size();
    int col = farmland[0].length();
    vector<pii> dots;
    for(int i = 0; i < row; i++) {
      for(int j = 0; j < col; j++) {
	if(farmland[i][j] == 'C') {
	  dots.push_back(pii(i, j));
	}
      }
    }
    int mini = INF;
    for(int i = 0; i < dots.size(); i++) {
      int tmp = 0;
      int x = dots[i].X; int y = dots[i].Y;
      for(int j = 0; j < dots.size(); j++) {
	int nx = dots[j].X; int ny = dots[j].Y;
	tmp += (nx-x)*(nx-x)+(ny-y)*(ny-y);
      }
      mini = min(tmp, mini);
    }
    return mini;


medium
はじめてリスト使ったわ.おそらくこれが最速。left.size() <= 10なのでpermutationつかってもいいけど、こっちのほうが精神衛生上?いいと判断.

class StandInLine {
public:
  vector <int> reconstruct(vector <int> left) {
    list<int> order;
    list<int>::iterator it;
    int sz = left.size();
    for(int i = sz-1; i >= 0; i--) {
      int cnt = 0; 
//リストは[]演算子と-演算子を使えない.
      for(it = order.begin(); it != order.end(); it++) {
	if(cnt == left[i]) break;
	if(i+1 < *it) cnt++;
      }
      
      order.insert(it, i+1);
    }
    return vector<int>(order.begin(), order.end() );
				   
  }

difficult
作りうる最大の三角形の面積を求めなさいというもの。
とりあえず、大きい辺からできうる三角形をひたすらつくったらいいんだろ、とか思ってたら2)の4 4 4 7でひっかかった。
[4, 4, 4]-->6.92.. [7, 4, 4]-->6.75.. でアウトになる.
大筋は合ってるから、dp使えばいいのかなと思ったらうまくいった.意外と簡単.
多分問題なす.

class GrasslandFencer {
private:
  double solveTriangleArea(int a, int b, int c);
public:
  double maximalFencedArea(vector <int> fences) {
    int sz = fences.size();
    sort(fences.begin(), fences.end());
    double dp[sz+1];
    memset(dp, 0, sizeof dp);
    for(int i = 2; i < sz; i++) {
      dp[i+1] = max(dp[i-2]+solveTriangleArea(fences[i], fences[i-1], fences[i-2]), dp[i]);
    }
    return dp[sz];
  }
    
};
//premises a > b > c
double GrasslandFencer::solveTriangleArea(int a, int b, int c) {
  if(a < b+c) {
    double p = (a+b+c)*1.0/2;
    return sqrt(p*(p-a)*(p-b)*(p-c) );
  }
  return 0.0;
}
他の人のソース見たけど、2重、3重ループしてる.
ちょっと考察.
area = sqrt(p*(p-a)*(p-b)*(p-c) )
a:固定.a = 4とする。
[4, 4, 4] > 
[4, 4, 3] >
[4, 4, 2] >
..

[4, 4, 4] >
[4, 3, 3] >
[4, 3, 2] >
...
てな感じになるはずだよね。
面積としては、
で、[4, 4, 4] > [4, 4, 3] > [4, 3, 3] > [4, 3, 2] 以下存在しない.
みたいになるはず.
それなら、b,cをできる限り大きいものにすると、面積は最大になるはず。
え..あってるよね..a = 7とかでもおなじ。