Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string>
- #include <vector>
- #include <algorithm>
- #include <stdio.h>
- int countDigit(int n) {
- int c = (n ? 0:1);
- while (n > 0)
- ++c, n /= 10;
- return c;
- }
- struct RealNumber {
- int mant, exp;
- RealNumber(): mant(0), exp(0) { }
- RealNumber(int mant, const std::string & exp)
- : mant(mant * getMultFromUnit(exp))
- , exp( getExpFromUnit(exp) + getExpFromPrefix(exp))
- { }
- static int getMultFromUnit (const std::string & exp) {
- return (exp.back() == 'p' ? 1638 : 1);
- }
- static int getExpFromUnit (const std::string & exp) {
- switch (exp.back()) {
- case 'p': return 1;
- case 't': return 6;
- default: return 0;
- }
- }
- static int getExpFromPrefix(const std::string & exp) {
- switch (exp.front()) {
- case 'm': return -3;
- case 'k': return 3;
- case 'M': return 6;
- case 'G': return 9;
- default: return 0;
- }
- }
- };
- bool operator < (RealNumber a, RealNumber b) {
- int cda = countDigit(a.mant), cdb = countDigit(b.mant);
- int ca = cda+a.exp, cb = cdb+b.exp;
- if (ca < cb)
- return true;
- else if (ca > cb)
- return false;
- else {
- while (cda < cdb)
- --a.exp, ++cda, a.mant *= 10;
- while (cda > cdb)
- --b.exp, ++cdb, b.mant *= 10;
- return a.mant < b.mant;
- }
- }
- struct Item {
- RealNumber weight;
- int mant;
- std::string exp;
- Item() : weight() {}
- Item(int mant, std::string & exp) : mant(mant), exp(exp), weight(mant, exp) { }
- void scan() {
- char s[3];
- scanf("%d %2s", &mant, s);
- weight = RealNumber(mant, exp = s);
- }
- void print() {
- printf("%d %s\n", mant, exp.c_str());
- }
- };
- bool operator < (const Item & a, const Item & b) {
- return a.weight < b.weight;
- }
- int main() {
- int n;
- scanf("%d", &n);
- std::vector<Item> v(n);
- for (auto & it : v)
- it.scan();
- std::stable_sort(v.begin(), v.end());
- for (auto & it : v)
- it.print();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement