ABC226 チャレンジ結果

ABC226結果：AB(2)2完
Cで苦戦し苦い結果に...

A：四捨五入の問題. 調べて標準機能に頼る. 
実装するならstrとintの変換をやればいいのかなと思ったがC++でのやり方よく分からず.

```C++:Round_decimals.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <cmath>
using namespace std;

int main(){
    double X;
    cin >> X;

    cout << round(X) << endl;
}
```

B：重複を無視するためset型に入れて長さ測ればよし.

```C++:Counting_Arrays.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <cmath>
using namespace std;

int main(){
    int N;
    cin >> N;

    set<vector<int> > L;
    for (int i=0;i<N;i++){
        int Li;
        cin >> Li;
        vector<int> suuretu(Li+1);
        suuretu[0] = Li;
        for (int j=1;j<Li+1;j++){
            int aij;
            cin >> aij;
            suuretu[j] = aij;
        }
        L.insert(suuretu);


    }
    cout << L.size() << endl;
    return 0;
}
```

C：方法は分かったが, 実装の問題でTLEに. FIFOでやったが, このやり方だと習得が必要なある技が何度も出たときに, 同じ動作を無駄に繰り返すことになってしまう. 無念.

```C++:Martial_artist.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <cstdlib>
#include <cmath>
using namespace std;

int main(){
    int N;
    cin >> N;
    vector<int> T(N, 0);
    vector<vector<int> > dependence;

    for (int i=0;i<N;i++){
        int Ti;
        cin >> Ti;
        T[i] = Ti;

        int Ki;
        cin >> Ki;
        vector<int> depen_i(Ki+1, 0);
        depen_i[0] = Ki;
        for (int j=1;j<Ki+1;j++){
            int aij;
            cin >> aij;
            depen_i[j] = aij; 
        }
        dependence.push_back(depen_i);
    }

    
    vector<int> juzu;
    set<int> timen;
    timen.insert(N);
    check.insert(N);
    while (juzu.size()){
        int sirabe = juzu.front();
        juzu.erase(juzu.begin());

        if (dependence[sirabe - 1][0] > 0){
            for (int j=1;j<dependence[sirabe - 1][0]+1;j++){
                juzu.push_back(dependence[sirabe - 1][j]);
                timen.insert(dependence[sirabe - 1][j]);
            }
        }
        
    }
    long long ans = 0;
    
    for (auto x:timen){
        ans += T[x - 1];
    }
    cout << ans << endl;
    return 0;
}
```

D：コンテスト終了後にチャレンジしたらCより簡単に解けた. こっちに取り組むべきだった！
差を測って最大公約数で割ってsetで管理するだけ. Bに似てるような.

```C++:Teleportation.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <cstdlib>
#include <cmath>
#include <tuple>
using namespace std;

int gcd(int a, int b){
   if (b == 0){
       return(a);
   }
   else{
       return(gcd(b, a%b));
   }
}

int lcm(int a, int b){
   return a  / gcd(a, b) * b;
}

int main(){
    int N;
    cin >> N;

    vector<vector<int>> mati;
    for (int i=0;i<N;i++){
        vector<int> matii;
        int x, y;
        cin >> x >> y;
        matii.push_back(x);
        matii.push_back(y);
        mati.push_back(matii);
    }

    set<tuple<int, int>> mahou;
    for (int i=0;i<N;i++){
        for (int j=i+1;j<N;j++){
            int x = mati[i][0] - mati[j][0];
            int y = mati[i][1] - mati[j][1];

            int z = gcd(x, y);
            x = x / z;
            y = y / z;
            tuple<int, int> p = make_tuple(x, y);
            tuple<int, int> q = make_tuple(-x, -y);
            mahou.insert(p);
            mahou.insert(q);
        }
    }

    cout << mahou.size() << endl;


}
```

相変わらず停滞中でギリギリ茶色を維持してる. 次こそは！