Advertisement
dmkozyrev

252.cpp

May 7th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include <string>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <stdio.h>
  5.  
  6. int countDigit(int n) {
  7.     int c = (n ? 0:1);
  8.     while (n > 0)
  9.         ++c, n /= 10;
  10.     return c;  
  11. }
  12.  
  13.  
  14. struct RealNumber {
  15.    
  16.     int mant, exp;
  17.    
  18.     RealNumber(): mant(0), exp(0) { }
  19.    
  20.     RealNumber(int mant, const std::string & exp)
  21.         : mant(mant * getMultFromUnit(exp))
  22.         , exp( getExpFromUnit(exp) + getExpFromPrefix(exp))
  23.     { }
  24.    
  25.     static int getMultFromUnit (const std::string & exp) {
  26.         return (exp.back() == 'p' ? 1638 : 1);
  27.     }
  28.    
  29.     static int getExpFromUnit (const std::string & exp) {
  30.         switch (exp.back()) {
  31.             case 'p':   return 1;
  32.             case 't':   return 6;
  33.             default:    return 0;
  34.         }
  35.     }
  36.    
  37.     static int getExpFromPrefix(const std::string & exp) {
  38.         switch (exp.front()) {
  39.             case 'm':   return -3;
  40.             case 'k':   return 3;
  41.             case 'M':   return 6;
  42.             case 'G':   return 9;
  43.             default:    return 0;
  44.         }
  45.     }  
  46. };
  47.  
  48. bool operator < (RealNumber a, RealNumber b) {
  49.     int cda = countDigit(a.mant), cdb = countDigit(b.mant);
  50.     int ca = cda+a.exp, cb = cdb+b.exp;
  51.     if (ca < cb)
  52.         return true;
  53.     else if (ca > cb)
  54.         return false;
  55.     else {
  56.         while (cda < cdb)
  57.             --a.exp, ++cda, a.mant *= 10;
  58.         while (cda > cdb)
  59.             --b.exp, ++cdb, b.mant *= 10;
  60.         return a.mant < b.mant;
  61.     }
  62. }
  63.  
  64. struct Item {
  65.     RealNumber weight;
  66.     int mant;
  67.     std::string exp;
  68.        
  69.     Item() : weight() {}   
  70.     Item(int mant, std::string & exp) : mant(mant), exp(exp), weight(mant, exp) { }
  71.        
  72.     void scan() {
  73.         char s[3];
  74.         scanf("%d %2s", &mant, s);
  75.         weight = RealNumber(mant, exp = s);
  76.     }
  77.    
  78.     void print() {
  79.         printf("%d %s\n", mant, exp.c_str());
  80.     }
  81. };
  82.  
  83. bool operator < (const Item & a, const Item & b) {
  84.     return a.weight < b.weight;
  85. }
  86.  
  87. int main() {
  88.     int n;
  89.     scanf("%d", &n);
  90.    
  91.     std::vector<Item> v(n);
  92.     for (auto & it : v)
  93.         it.scan();
  94.  
  95.     std::stable_sort(v.begin(), v.end());
  96.    
  97.     for (auto & it : v)
  98.         it.print();
  99.    
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement