IT・ビッグデータ徒然ブログ

関西でインフラ、データ基盤系のエンジニアになるため、転職活動中。

AtCoderに登録したら解くべき精選過去問10問の類題をC++で解いてみた(その4)

続き。ABC 087 B - Coinsの類題です。

ARC 004 A 2点間距離の最大値

  • 複数あ座標を線分で結んだ時にその線分の距離が最大になる距離を求める
  • 距離の公式を使う。
  • かつ全ての線分を探索するため2重forループを使用。
#include <iostream>
#include <cmath>

using namespace std;

int main() {
    int N,x[110],y[110],i,j,k;
    double maxdistance = 0;
   double xd,yd,distance;


   
    cin >> N;
    for(i = 0; i < N; i++) {
        cin >> x[i] >> y[i];
    }

    for(j = 0;j < N;j++) {
        for(k = j; k < N; k++) {
            xd = pow(x[j] - x[k],2.0);
            yd = pow(y[j] - y[k],2.0);

            distance = sqrt(xd + yd);
            if(maxdistance <= distance) {
                maxdistance = distance;
            }
        }
    }
    cout << maxdistance << endl;
       
    return 0;
}

ABC 063 B - Varied

  • 指定された文字列が全て異なる文字で形成されているかどうかを判別
  • 制約上全探索しても問題ないので単純にforループを回して同じ文字があるかどうかを判定
#include <iostream>
#include <string>


using namespace std;

int main() {
    int i,j;
    string str;

    cin >> str;

    for(i = 0; i<str.length(); i++){
        for(j = i + 1; j < str.length(); j++){
            if(str[i] == str[j]){
                 cout << "no" << endl;
                 return 0;
            }
        }
    }
   
    cout << "yes" << endl;
       
    return 0;
}

ABC 051 B - Sum of Three Integers

  • ある数値の範囲内におさまるx,y,zがある
  • x + y + z = Sとなるx,y,zの組み合わせの数を算出する
  • x,y,zを全てループで回してもよいが、時間的制約も気になるので、以下のようにプログラムを組んでみた
    • x,yの値はforループ
    • zの値はSからxとyを引いた値とする
    • このzが決められた数値の範囲内でかつ0以上かどうかを判定
#include <iostream>


using namespace std;

int main() {

    int k,s,x,y,z;
    int counter = 0;

    cin >> k >> s;

    for(x = 0; x <= k;x++) {
        for(y = 0;y <= k; y++){

            z = s - x - y;

            if(z >= 0 && z <= k) {
                counter++;
            }

        }
    }
   
    cout << counter << endl;
       
    return 0;
}