くっそ久しぶりの更新です。院試とかいろいろで競プロやっていなかったので、問題が溜まってる溜まってる。気がついたらABCが6問になってて、まじ???ていう。これから2年間半は電気を一切やらなくて良くなったので、流石に真面目にやろうと思いました。(n年ぶりm回目)
今回解いた問題はABC128のB問題です。
[blogcard url=”https://atcoder.jp/contests/abc128/tasks/abc128_b”]
目次
pair?
最初、出力の仕方を見てなかったので、sortしてそれをそのまま出力すればええんやろ!!って思ってました。そうして書いたコードが以下のものになります。
#include <iostream> #include <string> #include <utility> #include <vector> #include <algorithm> using namespace std; bool pair_comp(pair<string,int> a,pair<string,int> b){ if(a.first!=b.first){ return a.first<b.first; } if(a.second!=b.second){ return a.second>b.second; }else{ return true; } } int main(int argc, char const *argv[]) { int n; cin>>n; vector<pair<string,int>> v; for(int i=0;i<n;i++){ string s; int tmp; cin>>s>>tmp; v.push_back(make_pair(s,tmp)); } sort(v.begin(),v.end(),pair_comp); for(int i=0;i<n;i++){ cout<<v[i].first<<" "<<v[i].second<<endl; } return 0; }
これを書いていたときに初めて知ったことは、sortの使い方です。
bool pair_comp(pair<string,int> a,pair<string,int> b){ if(a.first!=b.first){ return a.first<b.first; } if(a.second!=b.second){ return a.second>b.second; }else{ return true; } }
こうやって、関数を定義して、
sort(v.begin(),v.end(),pair_comp);
としてやれば、secondでも比較できます。知らんかった。
参考文献
【C++】pairのsecondを基準にソート(abc103_d)
tupleを使おう
さて、真面目に問題を解きましょう。
2つの型の値を持つならpairですが、3つ以上ならtupleが使えます。
以下、提出したコード
#include <iostream> #include <vector> #include <string> #include <algorithm> #include <utility> #include <tuple> using namespace std; int main(int argc, char const *argv[]) { int n; cin>>n; vector<tuple<string,int,int>> v; for(int i=0;i<n;i++){ string s; int tmp; cin>>s>>tmp; v.push_back(make_tuple(s,tmp*(-1),i+1)); } sort(v.begin(),v.end()); for(int i=0;i<n;i++){ cout<<get<2>(v.at(i))<<endl; } return 0; }
tupleをsortするときですが、昇順でsortされるので、secondの値(tupleでこういう言い方をするかは知らないけど・・・)に-1をかけることで結果的に降順にsortされるようにしています。
tupleを使ったのは(多分)初めてだったので、要素の取得の仕方がpairと違ってて困惑しました。また、vectorのatを久しぶりに使ったので、あったな、こんなのって思い出していました。
参考文献
まとめ
tuple便利だから、頑張って使おう。