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
関数を使って合計求められないかなって思って、+
演算子をオーバーロードしたりしてたんですがちょっと上手く行かなかった。
いろいろ調べたりしてるうちに時間がそれなりに過ぎてしまったので今日はここまで。