金魚亭日常

読書,ガジェット,競技プログラミング

AtCoder ABC #137

出場はしてない

A. +-x

問題文の通りに最大値を出力する.

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <sstream>
#include <string>

using namespace std;

void solve(int a, int b) { printf("%d\n", max({a + b, a - b, a * b})); }

int main() {
  int a, b;
  cin >> a >> b;
  solve(a, b);
  return 0;
}

https://atcoder.jp/contests/abc137/submissions/7038126

B

範囲に気を付けて,x - k + 1 から x + k - 1 を出力する

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <sstream>
#include <string>

using namespace std;

void solve(int k, int x) {
  int l, r;
  l = max(-1000000, x - k + 1);
  r = min(1000000, x + k - 1);
  for (int i = l; i < r; i++) {
    printf("%d ", i);
  }
  printf("%d\n", r);
}

int main() {
  int k, x;
  cin >> k >> x;
  solve(k, x);
  return 0;
}

https://atcoder.jp/contests/abc137/submissions/7038666

C

アナグラム判定はsortでやって,同じものがいくつあるかを数えて,それぞれについて   {}_n C_2 を全部足す.

一回 int にしていて WAになった.

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <sstream>
#include <string>

using namespace std;

void solve(map<string, long long> m) {
  long long ans = 0;
  for (auto item : m) {
    ans += item.second * (item.second - 1) / 2;
  }
  printf("%lld\n", ans);
}

int main() {
  int n;
  cin >> n;
  map<string, long long> m;
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    sort(s.begin(), s.end());
    m[s] += 1;
  }
  solve(m);
  return 0;
}

https://atcoder.jp/contests/abc137/submissions/7038666

D

最終日からさかのぼって処理する. 残り日数以下の仕事をque に全部入れて,報酬が最大のものを取り出す,ということをやっていく.

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <sstream>
#include <string>

using namespace std;

typedef struct {
  int A;
  int B;
} Job;

bool comp(const Job &a, const Job &b) { return a.A < b.A; }

void solve(int N, int M, vector<Job> jobs) {
  priority_queue<int> que;
  int ans = 0;
  int i = 0;
  for (int m = 0; m <= M; m++) {
    while (jobs[i].A <= m && i < N) {
      que.push(jobs[i].B);
      i++;
    }
    if (!que.empty()) {
      int b = que.top();
      que.pop();
      ans += b;
    }
  }
  printf("%d\n", ans);
}

int main() {
  int N, M;
  cin >> N >> M;
  vector<Job> jobs(N);
  for (int i = 0; i < N; i++) {
    int A, B;
    cin >> A >> B;
    Job job = {A, B};
    jobs[i] = job;
  }
  sort(jobs.begin(), jobs.end(), comp);
  solve(N, M, jobs);
  return 0;
}

https://atcoder.jp/contests/abc137/submissions/7047537