解いた問題

6/25/2012

Codeforces Round #126 (Div. 2)

BCDだけ解いた。実装ゲー。



B
#include <algorithm>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <deque>
#include <set>
#include <sstream>
#include <stack>
#include <vector>

#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define REP(i, n) for(int i=0; i<(int)n; ++i)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(),(c).end()
#define each(i, c) FOR(i, c)

typedef long long int lli;

using namespace std;

int main(int argc, char *argv[])
{
  int n;
  while (cin >> n) {
    double p[n];
    for (int i = 0; i < n; ++i) {
      cin >> p[i];
    }

    double x = accumulate(p, p + n, 0LL);
    printf("%.10lf\n", x / (n * 100.0) * 100.0);
  }
  return 0;
}

C
#include <algorithm>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <deque>
#include <set>
#include <sstream>
#include <stack>
#include <vector>

#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define REP(i, n) for(int i=0; i<(int)n; ++i)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(),(c).end()
#define each(i, c) FOR(i, c)

typedef long long int lli;

using namespace std;

const string S = "BERLAND";

map<string, int> _name;
map<int, string> rev;
int name(string s)
{
  if (_name.count(s)) ; else {
    int tmp = _name.size();
    _name[s] = tmp;
    rev[tmp] = s;
  }
  return _name[s];
}

const int N = 4;
pair<int, int> g[N][N];

struct T {
  int t, w, l;
  string name;
  T (int _t, int _w, int _l, string n)
    : t(_t), w(_w), l(_l), name(n) {}
};

bool operator < (const T &a, const T &b)
{
  if (a.t != b.t) return a.t < b.t;
  int diffA = a.w - a.l;
  int diffB = b.w - b.l;
  if (diffA != diffB) return diffA < diffB;
  if (a.w != b.w) return a.w < b.w;
  return a.name > b.name;
}

bool solve(void)
{
  int p[N];
  int win[N];
  int lose[N];
  fill(p, p + N, 0);
  fill(win, win + N, 0);
  fill(lose, lose + N, 0);

  for (int i = 0; i < N; ++i) {
    for (int j = i + 1; j < N; ++j) {
      if (g[i][j].first == g[i][j].second) {
        p[i] += 1;
        p[j] += 1;
      } else if (g[i][j].first < g[i][j].second) {
        p[j] += 3;
      } else if (g[i][j].first > g[i][j].second) {
        p[i] += 3;
      }
    }
  }

  for (int i = 0; i < N; ++i) {
    for (int j = 0; j < N; ++j) {
      if (i == j) continue;
      win[i] += g[i][j].first;
      lose[i] += g[i][j].second;
    }
  }

  vector<T> v;
  for (int i = 0; i < N; ++i) {
    v.push_back(T(p[i], win[i], lose[i], rev[i]));
  }

  sort(v.begin(), v.end());
  reverse(v.begin(), v.end());
  return v[0].name == S || v[1].name == S;
}

pair<int, int> better(pair<int, int> a, pair<int, int> b)
{
  if (a.first == -1) return b;
  int diffA = a.first - a.second;
  int diffB = b.first - b.second;
  if (diffA != diffB) return diffA < diffB ? a : b;
  return a.second < b.second ? a : b;
}

int main(int argc, char *argv[])
{
  while (true) {
    _name.clear();
    rev.clear();
    fill(&g[0][0], &g[N - 1][N], make_pair(-1, -1));

    for (int i = 0; i < 5; ++i) {
      string a, b;
      char c;
      int n, m;
      cin >> a >> b >> n >> c >> m;
      g[name(a)][name(b)] = make_pair(n, m);
      g[name(b)][name(a)] = make_pair(m, n);
    }

    if (_name.size() != 4) break;

    int i = name(S);
    pair<int, int> res = make_pair(-1, -1);
    for (int j = 0; j < N; ++j) {
      if (i == j) continue;
      if (g[i][j].first == -1) {
        for (int x = 0; x <= 100; ++x) {
          for (int y = 0; y < x; ++y) {
            if (x > y) ; else continue;
            g[i][j] = make_pair(x, y);
            g[j][i] = make_pair(y, x);
            if (solve()) res = better(res, make_pair(x, y));
          }
        }
      } else { continue; };
      break;
    }
    if (res.first != -1) cout << res.first << ":" << res.second << endl;
    else cout << "IMPOSSIBLE" << endl;
  }
  return 0;
}

D
#include <algorithm>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <deque>
#include <set>
#include <sstream>
#include <stack>
#include <vector>

#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define REP(i, n) for(int i=0; i<(int)n; ++i)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(),(c).end()
#define each(i, c) FOR(i, c)

typedef long long int lli;

using namespace std;

struct F {
  string name;
  vector<string> args;
  F (string n, vector<string> a) : name(n), args(a) {};
};

bool match(F &a, F &b)
{
  if (a.name != b.name) return false;
  if (a.args.size() != b.args.size()) return false;
  const int size = a.args.size();
  for (int i = 0; i < size; ++i) {
    if (a.args[i] == "T") continue;
    if (a.args[i] != b.args[i]) return false;
  }
  return true;
}

int main(int argc, char *argv[])
{
  int func;
  while (cin >> func) {
    cin.ignore();

    vector<F> fs;
    for (int i = 0; i < func; ++i) {
      string ret;
      string name;
      string line;
      getline(cin, line);
      replace(line.begin(), line.end(), ',', ' ');
      replace(line.begin(), line.end(), '(', ' ');
      replace(line.begin(), line.end(), ')', ' ');

      istringstream iss(line);
      iss >> ret;
      iss >> name;
      vector<string> v;
      for (string s; iss >> s; v.push_back(s)) ;
      fs.push_back(F(name, v));
    }

    map<string, string> ts;

    int var;
    cin >> var;
    for (int i = 0; i < var; ++i) {
      string type;
      string name;
      cin >> type >> name;
      ts[name] = type;
    }
    cin.ignore();

    int call;
    cin >> call;
    cin.ignore();
    while (call--) {
      string name;
      string line;
      getline(cin, line);
      replace(line.begin(), line.end(), ',', ' ');
      replace(line.begin(), line.end(), '(', ' ');
      replace(line.begin(), line.end(), ')', ' ');

      istringstream iss(line);
      iss >> name;
      vector<string> v;
      int cnt = 0;
      for (string s; iss >> s; v.push_back(ts[s])) ;
      for (int i = 0; i < func; ++i) {
        F f(name, v);
        cnt += match(fs[i], f);
      }
      cout << cnt << endl;
    }
  }
  return 0;
}