配点: 200 点 / 実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 74 / NoviSteps: 5Q
問題概要
人が
回の
0か1かを選択する投票を行った。各人の各回の投票は 個の長さ
の
0, 1からなる文字列 として与えられ、
は人
の
回目の投票への内容を表す。
各回の投票では、次のルールで得点が与えられる。
- その回の投票で
0を選択した人が人、
1を選択した人が人いたとする。
または
のとき : その投票では全員に
点が与えられる。
- そうでなく
のとき : その投票で
0に投票した人のみに点が与えられる。
- そうでないとき : その投票で
1に投票した人のみに点が与えられる。
回の投票を終えた後、それらの投票における合計の得点が最も高い人を全員求めよ。
制約
は
を満たす奇数
は
を満たす整数
考察
基本的には問題文の通りにやるだけ。
各回ごとに、 人の投票状況を読み取りながら
を計算していき、両者の関係によって得点を加算していく。
その後、得点の最大値を求め、その得点を取った人の番号を順に出力する。
実装例
得点の最大値を求める過程で、ranges::max_elementを使っている。
#include <bits/stdc++.h> using namespace std; #define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++) template <typename T> inline bool chmax(T &a, T b) { return ((a < b) ? (a = b, true) : (false)); } // ======================================== // int main() { int N, M; cin >> N >> M; vector<string> S(N); rep(i, 0, N) cin >> S[i]; vector<int> points(N, 0); rep(j, 0, M) { int x = 0, y = 0; rep(i, 0, N) { if (S[i][j] == '0') x++; else y++; } if (x == 0 || y == 0) { rep(i, 0, N) points[i]++; } else if (x < y) { rep(i, 0, N) { if (S[i][j] == '0') points[i]++; } } else { rep(i, 0, N) { if (S[i][j] == '1') points[i]++; } } } int max_val = *ranges::max_element(points); rep(i, 0, N) { if (points[i] == max_val) cout << i + 1 << " "; } return 0; }
実装時間: 5分
コメント
B問題にしてはやることが多めな印象。