AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
私のアカウント
解いた問題
本日解いた問題
B - Counting Arrays
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
int main() {
ll n,l;
cin >> n;
set<vector<ll>> a;
rep(i,n){
cin >> l;
vector<ll> tmp(l);
rep(j,l){
cin >> tmp[j];
}
a.insert(tmp);
}
cout << a.size() << endl;
}
解法
要素が追加されるたびにすべての要素と比較をすると計算量がオーバーしてしまうためsetを用いて解く。
B - KEYENCE building
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
int main() {
ll n;
cin >> n;
vec s(n);
rep(i,n) cin >> s[i];
ll res = 0;
rep(i,n) {
bool jud = false;
for(int j=1;j<150;j++) {
for(int k=1;k<150;k++){
if(s[i] == 4*j*k + 3*j + 3*k) jud = true;
}
}
if(!jud) res++;
}
cout << res << endl;
}
解法
S=4ab+3a+3bとなるaとbを全探索し、それをn回行う。
B - Takahashi's Secret
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
int main() {
ll n, x;
cin >> n >> x;
vec a(n);
for(int i=1;i<n+1;i++) cin >> a[i];
set<ll> res;
for(int i=1;i<n+1;i++){
res.insert(x);
x = a[x];
}
cout << res.size() << endl;
}
解法
setを用い、秘密を知っている人間を重複しないように数える。
公式の解法を見たところ重複したタイミングで終了していたがこちらでもACできた。
C - Long Sequence
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
int main() {
ll n, x;
cin >> n;
vec a(n);
ll sum = 0;
rep(i,n) {
cin >> a[i];
sum += a[i];
}
cin >> x;
ll k = x / sum;
sum *= k;
k *= n;
for(int i=0;i<n;i++){
sum += a[i];
k++;
if(sum > x) break;
}
cout << k << endl;
}
解法
まず、Aの総和sumを求めて、xをsumで割る。割ったものにnを乗算して、そこまでの項を求める。その後Aを1つずつ加算してxより大きくなったタイミングで終了する。