AtCoder ABC118
引き続き、ABCの3完だった。いい調子だと思う。
A問題
問題文通り。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <numeric>
#include <cassert>
#include <memory>
#include <stack>
#include <set>
#include <map>
#define INF 1000000000
#define MOD 1000000007
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
int a,b; cin>>a>>b;
int ans = 0;
if(b % a == 0) {
ans = a + b;
} else {
ans = b - a;
}
cout << ans << endl;
}
B問題
こういう「各データの登場頻度を記録し解答を求める」タイプは、連想配列の出番である。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <numeric>
#include <cassert>
#include <memory>
#include <stack>
#include <set>
#include <map>
#define INF 1000000000
#define MOD 1000000007
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
int N, M; cin>>N>>M;
map<int,int> dict; // kind, love
for(int i=0; i<N; i++) {
int K; cin>>K;
for(int j=0; j<K; j++) {
int a; cin>>a;
dict[a]++;
}
}
int ans = 0;
for(auto p: dict) {
if(p.second == N) {
ans++;
}
}
cout << ans << endl;
}
C問題
最初は最大値を最小値で割った時の余りを使って、さらに各数値を割っていって・・・ってトンチンカンなことやってた。
「すべて偶数の時の答えが2で、奇数が混じってたら1で、同じ数値しかなかったらその数値が答え、ってなんだよ???」
「あ、最大公約数か」
gcdライブラリ、ネットからパクっててよかった。C++17からじゃないと標準ライブラリにないらしいからな。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <numeric>
#include <cassert>
#include <memory>
#include <stack>
#include <set>
#include <map>
#define INF 1000000000
#define MOD 1000000007
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
// 最大公約数 greate common diviser
template<typename T>
T gcd(T a, T b) {
return b ? gcd(b, a % b) : a;
}
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
int N; cin>>N;
vector<int> A(N);
for(int i=0; i<N; i++) {
cin>>A[i];
}
int ans = INF;
for(int i=0; i<N-1; i++) {
ans = min(ans, gcd<int>(A[i], A[i+1]));
}
cout << ans << endl;
}
D問題
マッチを使い切らなければならないが、できるだけ多くの数値を並べられるように(その方が桁数が増えるから)使い切る方法がまったくわからん。 いずれは超えなければならない壁ではあるのだけど・・・。
追記
「greate」ってなんやねん。「greatest」やろ、あほか。おれのことやけど。