文系ギャルが0から始める競技プログラミング#32
Intro
この記事は不定期連載です。
↓最初の一本はこちら↓
文系ギャルが0から始める競技プログラミング#0
↓直前の記事はこちら↓
文系ギャルが0から始める競技プログラミング#31
・ABC113C - 0で埋める
まるごと引用の楽さに気づいてしまった。
今回からこれで行きます!!!!!!!!
まず手順を考えます。
考えなきゃいけなさそうなことは…
・市の順番を出す
・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;
}
}
これで市のIDはOK。
県はもともと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に続く !(不定期連載です。)
これは成功と挫折を繰り返し、
タピオカ片手に難問を解く、
ギャルプログラマが生まれるまでの物語である…。