ABC029を解いてみた
A問題
文字列の最後にsを連結しました。
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define MOD 1000000007 #define INF 1000000000 #define PI 3.14159265359 int main(void) { string s; cin >> s; cout << s + 's' << endl; return 0; }
B問題
全ての文字列についてrが含まれているか全探索しました。
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define MOD 1000000007 #define INF 1000000000 #define PI 3.14159265359 int main(void) { string s[12]; for(int i=0; i<12; i++) cin >> s[i]; int ans = 0; for(int i=0; i<12; i++) { for(int j=0; j<s[i].size(); j++) { if(s[i][j] == 'r') {ans++; break;} } } cout << ans << endl; return 0; }
C問題
8重のforループを書く気はしなかったので深さ優先探索で全列挙しました。
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define MOD 1000000007 #define INF 1000000000 #define PI 3.14159265359 int n; char s[3] = {'a', 'b', 'c'}, ans[10]; int dfs(int i) { if(i == n) {cout << ans << endl; return 0;} for(int j=0; j<3; j++) { ans[i] = s[j]; dfs(i+1); } return 0; } int main(void) { cin >> n; dfs(0); return 0; }
D問題
9まで、99まで、999まで…に1が出てくる数を求め、この数と各桁の数に応じて場合分けして全パターンを求めました。
昔算数でこんな問題解いた気がします。解説の解法がシンプルでわかりやすかった。
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define MOD 1000000007 #define INF 1000000000 #define PI 3.14159265359 //10のべき乗を求める ll mypow(int i) { ll ret = 1; for(int j=0; j<i; j++) ret *= 10; return ret; } int main(void) { ll memo[15], n, ans = 0; cin >> n; //桁数を求める int digit = 0; ll _n = n; while(_n > 0) { _n /= 10; digit++; } // 9まで、99まで、999まで…に含まれる1の数を求める memo[0] = 1; for(int i=1; i < digit; i++) { memo[i] = mypow(i) + (memo[i-1]*10); } int temp; for(int i=digit-1; i > 0; i--) { // i桁目の数 temp = n / mypow(i); if(temp >= 2) { ans += mypow(i) + temp*memo[i-1]; } else if(temp == 1) { // a = n % 10^i ll a = n - temp*mypow(i); ans += a + memo[i-1] + 1; } // temp * 10^i までに含まれるiの数が求められている n -= temp * mypow(i); } // 1の位が1以上なら1の数はプラス1 if(n >= 1) {ans++;} cout << ans << endl; return 0; }