###### tags: `tutorial` `CompetitiveProgramming` `數講統治下的資專筆記們` `解題筆記` # Kattis: A Classy Problem [題目在這兒](https://open.kattis.com/problems/classy) ### 題解 做法其實就是暴力>< 先建立一個 struct(class) 存一個人的名字(string)、階級(int vector, 把三種階級轉換成123),再寫 cmp ,就可以直接 sort。 ```cpp=1 struct person{ string name; // 不要取class,會撞 vector<int> klass; person(string n, vector<int>k): name(n), klass(k){} }; ``` cmp 的話,先把 class 長度比較短的那個補滿 middle(2) ,再直接比較每一項大小即可。如果都一樣的話,判斷名字字典序大小。 ```cpp=1 bool cmp(person a, person b){ //用 while 直接補,懶得判了 while(a.klass.size() < b.klass.size()) a.klass.push_back(2); while(a.klass.size() > b.klass.size()) b.klass.push_back(2); for(int i = 0; i < a.klass.size(); i++){ // 注意,這裡和普通的 cmp 略為不同,大的要放前面喔。 if(a.klass[i] > b.klass[i]) return true; if(a.klass[i] < b.klass[i]) return false; } // class 一樣也要記得判斷喔。 return a.name < b.name; } ``` 需要特別注意的是,輸入 class 轉為 vector\<int\> 時,要記得 reverse,因為比較的時候是從後面比回來的。 > 舉例來說, lower-upper 是指 upper 裡的 lower。 ```cpp=1 cin >> n; // 用來存所有人的 vector<person> people.clear(); while(n--){ // 用 bin 來把輸入最後的 'class' 吃掉。 cin >> name >> klass >> bin; name.pop_back(); tmp.clear(); for(int i = 0; i < klass.size(); i++){ if(klass[i]=='u'){ tmp.push_back(3); i += 6-1; } else if(klass[i] == 'l'){ tmp.push_back(1); i+=6-1; } else { tmp.push_back(2); i+=7-1; } } // 記得 reverse 喔。 reverse(tmp.begin(), tmp.end()); people.push_back(person(name, tmp)); } // 爽爽 sort sort(people.begin(), people.end(), cmp); ``` 醬就 <font color='lightgreen'>AC</font> 囉。蠻水的啦。 > 上台灣8了開薰~~~