16日目 Beginner 33

16日目(2019/9/1)

AtCoder Beginner Contest 033

ずっと家から出かけていて、PCになかなか触れられなかったので2日空いてしまいました。

解けた問題

A:暗証番号

4桁のゾロ目を調べるということだったので、1111で割ったあまりが0ならSAMEそれ以外ならDIFFERENTと出力したよ

B:町の合併

いつもだったらint型の配列とstring型の配列を動的確保して出力、みたいにしてたけど、Townクラスとして定義して、vectorで追加して、計算してみた。
書きながら別にこれ最大と合計求めればいいだからメモリ的にも実行時間的にも読み込むたびに更新するのが最適解な気がしているけど…

// C++のテンプレート
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <numeric>

using namespace std;

class Town{
    public:
    string name;
    int people,index;
    Town(string n,int p,int i){
        people = p;
        name = n;
        index = i;
    }
    bool operator<(const Town &another) const
    {
        return people < another.people;
    }
};

int main(void){
    int N,sum=0;
    cin >> N;
    string name;
    int people;
    vector<Town> elem;
    for(int i=0;i<N;i++){
        cin >> name >> people;
        elem.push_back(Town(name,people,i));
    }
    sort(elem.begin(),elem.end());
    //sum = accumulate(elem.begin(),elem.end(),0);
    for(int i=0;i<N;i++){
        sum += elem[i].people;
    }
    if(sum < elem[N-1].people*2)
        cout << elem[N-1].name << endl;
    else
       cout << "atcoder" << endl;
}

sort関数に自作クラスTownを適用するために、演算子オーバーロードを実装したのがめちゃくちゃ久々でどうだったっけ?ってなってました。

 bool operator<(const Town &another) const{
        return people < another.people;
    }

sort関数では、与えられた要素を比較演算子<を使って比較しているため、新しく実装したclassで、比較するときはどの値を取り出すのかを定義してあげればいいんでしたね。 ほんとは与えられた要素の合計を求めるのにaccumulate関数を使って合計求められないかなって思って、+演算子オーバーロードしたりしてたんですがちょっと上手く行かなかった。
いろいろ調べたりしてるうちに時間がそれなりに過ぎてしまったので今日はここまで。