Official
A - 友達の人気度 / Popularity of Friends Editorial
by
A - 友達の人気度 / Popularity of Friends Editorial
by
MMNMM
初心者の方へ
- AtCoder をはじめたばかりで何をしたらよいか分からない方は、まずは practice contest の問題A「Welcome to AtCoder」を解いてみてください。基本的な入出力の方法が載っています。
- また、プログラミングコンテストの問題に慣れていない方は、AtCoder Beginners Selection の問題をいくつか解いてみることをおすすめします。
- C++入門 AtCoder Programming Guide for beginners (APG4b) は、競技プログラミングのための C++ 入門用コンテンツです。
- Python入門 AtCoder Programming Guide for beginners (APG4bPython) は、競技プログラミングのための Python 入門用コンテンツです。
この問題は、たとえば次のような問題に読み替えることで解くことができます。
はじめ、すべてが \(0\) である長さ \(N\) の数列 \(X=(X _ 1,X _ 2,\ldots,X _ N)\) がある。 \(X\) に対して次の操作を \(M\) 回行う。
- \(1\le u\lt v\le N\) を満たす整数 \(u,v\) が与えられる。\(X _ u\) に \(v\) を足し、\(X _ v\) に \(u\) を足す。
すべての操作が終わったあとの \(X\) の最大値を求めよ。
長さが \(N\) の配列を作成し、\(M\) 回の操作を実際に行って最大値を求めればよいです。
実装例は以下のようになります。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<long> sum(N);
for (int i = 0; i < M; ++i) {
int u, v;
cin >> u >> v;
sum[u - 1] += v; // アクセスは 0-indexed
sum[v - 1] += u;
}
// 最大値を出力する
cout << ranges::max(sum) << endl;
return 0;
}
N, M = map(int, input().split())
sum = [0 for i in range(N)]
for i in range(M):
u, v = map(int, input().split())
sum[u - 1] += v # アクセスは 0-indexed
sum[v - 1] += u
# 最大値を出力する
print(max(sum))
posted:
last update:
