スクリーンショット_2019-04-04_23

文系ギャルが0から始める競技プログラミング#32

Intro

この記事は不定期連載です。
↓最初の一本はこちら↓
文系ギャルが0から始める競技プログラミング#0

↓直前の記事はこちら↓
文系ギャルが0から始める競技プログラミング#31


・ABC113C - 0で埋める

まるごと引用の楽さに気づいてしまった。
今回からこれで行きます!!!!!!!!

C - ID

まず手順を考えます。
考えなきゃいけなさそうなことは…

・市の順番を出す
・0で埋める
・元の順番で出力する

元の順番出力しなければならないので、
県:市:元の順番の3つをセットで持っておかなきゃならなそうです。

市の順番を計算したあと、
最終的に元の順番に戻して、0で埋めて出力すればOK。

そのためには2重のpairで3つをセットで持っておくことにします。

   vector<pair<string,pair<int,int>>> A(M);
   for(int i=0;i<M;i++){
       cin >> A[i].first >> A[i].second.first;
       A[i].second.second = i;
   }

順番に 県:市:元の順番 にします。
これでソートすれば、県の中で市が順番に並びそうです。天才か?
ついでに答え用のansも用意しておきます。


   sort(A.begin(),A.end());
   vector<pair<int,pair<string,string>>> ans(M);


こちらは後で元の順番戻すために 元の順番:県:市 とすることにします!

ハコが揃ったところで市の順番を計算します。
最初の一個はどうしたって1なので、まず1番目を処理して、
前のと県が一緒だったら1を足してそうじゃなかったら1にするようにします。

   A[0].second.first = 1;
   for(int i=1;i<M;i++){
       if(A[i-1].first == A[i].first){
           A[i].second.first = A[i-1].second.first + 1;
       }else{
           A[i].second.first = 1;
       }
   }


これで市のIDOK
はもともとOKなので、あとは仕上げをします。

   for(int i=0;i<M;i++){
       ans[i].first = A[i].second.second;
       ans[i].second.first = A[i].first;
       ans[i].second.second = to_string(A[i].second.first);
   }
   sort(ans.begin(),ans.end());

ans[i].first = 元の順番は、3番目
ans[i].second.first = は、1番目
ans[i].second.second = は、さっき計算したのでintになってるのをstringに変換して2番目

順番を組み替えてしまい直します。
1番目元の順番になっているので、そのままソートしたら元の順番に直るはず。やっぱり天才でしょ。

0埋めして順番に出力します。

   for(int i=0;i<M;i++){
       cout << setfill('0') << setw(6) << ans[i].second.first;
       cout << setfill('0') << setw(6) << ans[i].second.second << endl;
   }

#include <iomanip>というのを入れとくと使えるらしい必殺技です!
便利ーーーーーー!

そうして書き上がったのがこちら

#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
#include <vector>
#include <regex>
#include <map>
#include <set>
#include <iomanip>
using namespace std;
using ll = long long;
int main() {
   int N,M;
   cin >> N >> M;
   
   vector<pair<string,pair<int,int>>> A(M);
   for(int i=0;i<M;i++){
       cin >> A[i].first >> A[i].second.first;
       A[i].second.second = i;
   }
   sort(A.begin(),A.end());
   vector<pair<int,pair<string,string>>> ans(M);
   
   A[0].second.first = 1;
   for(int i=1;i<M;i++){
       if(A[i-1].first == A[i].first){
           A[i].second.first = A[i-1].second.first + 1;
       }else{
           A[i].second.first = 1;
       }
   }
   for(int i=0;i<M;i++){
       ans[i].first = A[i].second.second;
       ans[i].second.first = A[i].first;
       ans[i].second.second = to_string(A[i].second.first);
   }
   sort(ans.begin(),ans.end());
   
   for(int i=0;i<M;i++){
       cout << setfill('0') << setw(6) << ans[i].second.first;
       cout << setfill('0') << setw(6) << ans[i].second.second << endl;
   }
       
       return 0;
   }

これは天才のムーブそのもの・・・・・
またうっかり優勝してしまいました。
タピオカ飲んだからかな・・・・・・・

もっとスマートな方法があればぜひTwitterやコメントでおしえてください!


そろそろ大技覚えるかー。

Outro


#33に続く !(不定期連載です。)

これは成功と挫折を繰り返し、
タピオカ片手に難問を解く、
ギャルプログラマが生まれるまでの物語である…。

この記事が気に入ったらサポートをしてみませんか?