AtCoder

ABC365 B問題(Second Best)を解く

AtCoder_ABC365_B

AtCoder が提供しているABC(AtCoder Beginner Contest)365 B問題をC++とPythonで解いてみました。ABC365は、2024年8月3日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

B問題 Second Best(Difficulty : 22)

問題の詳細は、リンク先をご覧ください。

ABC365 B問題 Second Best

2番目に大きな値のインデックスを出力します。AtCoder Problems による Difficulty は 22 でした。

解答案

C++ プログラム例(ABC365B)

配列を読み込み、最大値(first)とそのインデックス(result_first)、2番目に大きな値(second)とそのインデックス(result_second)を更新します。

最後に result_second を出力します。以下が、C++プログラムです。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	cin >> n;
	int first = 0;
	int second = 0;
	int result_first = -1;
	int result_second = -1;
	vector<int> a(n);
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
		if (a[i] > first) {
			second = first;
			result_second = result_first;
			first = a[i];
			result_first = i + 1;
		} else if (a[i] > second) {
			second = a[i];
			result_second = i + 1;
		}
	}

	cout << result_second << endl;

	return 0;
}

ソートしてもよいです。先に配列を読みながら、値とインデックスの組を更新します(12行目)。こちらのプログラムの方がすっきりと書けています。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	cin >> n;
	map<int, int> m;
	vector<int> a(n);
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
		m[a[i]] = i + 1;
	}
	sort(a.begin(), a.end(), greater<int>());

	cout << m[a[1]] << endl;

	return 0;
}

どちらも AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC365B)

C++プログラムのソート版をPythonに移植しました。以下がプログラムです。

"""AtCoder Beginner Contest 365 B"""
n = int(input())
a = list(map(int, input().split()))
m = {}
for i in range(n):
    m[a[i]] = i + 1
a.sort(reverse=True)

print(m[a[1]])

こちらも「AC」と判定されました。

最後に

基本的な問題でした。

引き続き ABC の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA