くっそ久しぶりの更新です。院試とかいろいろで競プロやっていなかったので、問題が溜まってる溜まってる。気がついたら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便利だから、頑張って使おう。