読者です 読者をやめる 読者になる 読者になる

年中春休み

年中春休みじゃないです。

競技プログラミング 6 (過去問 ABC 041)

abc041.contest.atcoder.jp


また遡ってやってみました。



A問題
i文字目ということで、i-1文字目を出力しました(日本語が下手)。

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
 
int main() {
	string s;
	int i;
	cin >> s >> i;
	cout << s[i - 1] << endl;
	return 0;
}



B問題
よく考えたらA,B,Cはそれぞれ10^9+7を超えることがないので、凄いバカっぽい計算をしてしまいました。
exampleで間違った答えを吐いたのでテンパってしまっていらない計算を挟んでしまいました……。

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
 
int main() {
	ll a, b, c;
	cin >> a >> b >> c;
	ll A, B, C, d;
	A = a % 1000000007;
	B = b % 1000000007;
	C = c % 1000000007;
	d = (A*B) % 1000000007;
	cout << (d*C) % 1000000007 << endl;
	return 0;
}



C問題
std::pairの使い方が全然わかっていないので使わないで済む方法で。
最初はa[100000]とb[100000]を使おうと思っていたんですが、何回やっても自分のPC上で上手くいかなかったので今の形にしましたが、他人の解答を見ているとa[100000]とb[100000]を使っていた解答が通っていたので環境の違い?なのかなと思いました。
ちょっと細かいところがわかっていないタイプのダメなオタクなのでそこらへんも勉強していきたいです……。
あと連想配列もちゃんと勉強しないとなあ……。

#include<iostream>
#include<string>
#include<algorithm>
#define ll long long
using namespace std;
 
int main() {
	ll a[100000];
	ll n;
	cin >> n;
	for (ll i = 0; i < n; i++) {
		cin >> a[i];
		a[i] *= 100000;
		a[i] += i; 
	}
	sort(a, a + n);
	for (ll i = n - 1; i >= 0; i--) {
		cout << a[i] % 100000 + 1 << endl;
	}
	return 0;
}



D問題
全くわからなくて投げたのですが、トポロジカルソートを使う割と典型問題っぽい?ですね。
トポロジカルソートに関しても未だに全くわかってないのでなんとかしていきたいです……。




C問題まではライブラリとかアルゴリズムとか曖昧でも書けば通るって印象ですが、D問題が全く手に付かないことが本当に多いので、勧められたとおりに蟻本をやってみるとかアルゴリズムの勉強をしてみるのがいいのかなという気がします。
D問題の解説読むだけじゃ知識がなさすぎて少し厳しいので。
ということでただ過去問解きまくるのはここらで止めておいた方がいいのかも?気分転換とかには良さそう。