LoginSignup
1
1

More than 5 years have passed since last update.

ABCノート [ABC101~110]

Last updated at Posted at 2018-06-24

101

A. Eating Symbols Easy

最初つい'+'じゃなく"+"とやってしまった。

#include <iostream>
#include <string>
using namespace std;
string s;
int main() {
  cin >> s;
  int c = 0;
  for(int i = 0; i < 4; i++){
    if (s[i] == '+') c++;
    else c--;
  }
  cout << c;
}

B. Digit Sums

whileの後にNは0になっていることを忘れてそのままif文でNを使ってしまって余計な時間を食った。ちゃんとtempとみたいな使い捨ての変数にコピーしよう。

#include <iostream>
using namespace std;
int n,N;
int main() {
  cin >> N;
  n = N;
  int sum = 0;
  while(N > 0) {
    sum += N%10;
    N /= 10;
  }
  if(n%sum == 0) cout << "Yes";
  else cout << "No";
}

C. Minimization

えっこれでいいの…?てしばらく深読みしてたやつ。A[N]いらない。

#include <iostream>
using namespace std;
int N,K;
int main() {
  cin >> N >> K;
  int A[N];
  for (int i = 1; i < N; i++) {
    if (K + (i-1)*(K-1) >= N) {
      cout << i; break;
    }
  }
}

別解

Yui_1991さんより。repとか便利だなあ。

#include "bits/stdc++.h"
using namespace std;
const int MOD = 1e9 + 7;
typedef long long lint;
typedef pair<int,int> P;
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define rep(i, n) for (lint i = 0; i < (n); i++)
#define INF LLONG_MAX
#define all(x) (x).begin(),(x).end()
#define pb push_back
int main(){
    int n,k;
    cin>>n>>k;
    int a[n];
    rep(i,n){
        cin>>a[i];
    }
    cout<<ceil(double(n-1)/(k-1))<<endl;
    return 0;
}

D.

テストがどうしても抜けられなかった。そもそも解いてる最中ずっと問題を正しく理解できている感じがしなかった。
for文のインデックスとかを中で使うのはいいのだけど、コード書いている間にiを含む式が最初期待していたのと違う挙動したりするから、ほんと変数の管理気をつけよう。

#include <iostream>
using namespace std;
int K;
int calcSum (int n) {
  int sum = 0;
  while (n > 0) {
    sum += n % 10;
    n /= 10;
  }
  return sum;
}
int main() {
  cin >> K;
  for (int i = 1; i < 10 && K > 0; i++, K--) cout << i << endl;
  if (K > 0) {
    for (int i = 0, c = 19; i < K; c += 9) {
      int top = c;
      while (top/calcSum(top) == (c-1)/calcSum(c-1)) {
        c--;
      }
      while (c <= top && i < K){
        cout << c++ << endl;
        i++;
      }
    }
  }
}

別解

UPSさんより。やっぱり問題を正しく理解できてなかったよよよ。。。ついn/S(n)の計算で小数点省いて考えてしまった。
こういう問題はまず紙に書いてパターン探してみよう。なんか高校数学思い出すな。。
参考

#include <bits/stdc++.h>
#include <tuple>
#include <iterator>
using namespace std;
using ll = long long;

ll sum(ll n)
{
  ll s = 0;
  while (n > 0)
  {
    s += n % 10;
    n /= 10;
  }
  return s;
}

int main()
{
  ll k;
  cin >> k;
  ll n = 1, d = 1;
  cout << 1 << endl;
  for (ll i = 1; i < k; ++i)
  {
    if (sum(n + d) * (n + d * 10) < sum(n + d * 10) * (n + d))
      d *= 10;
    n += d;
    cout << n << endl;
  }

  return 0;
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1