ABC128B問題解いた

投稿者: | 2019年8月14日

くっそ久しぶりの更新です。院試とかいろいろで競プロやっていなかったので、問題が溜まってる溜まってる。気がついたらABCが6問になってて、まじ???ていう。これから2年間半は電気を一切やらなくて良くなったので、流石に真面目にやろうと思いました。(n年ぶりm回目)

今回解いた問題は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便利だから、頑張って使おう。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください