码迷,mamicode.com
首页 > 其他好文 > 详细

TopCoder Practice SRM 144 Div 1

时间:2014-12-12 06:42:31      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

bubuko.com,布布扣
  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 #include <sstream>
  5 #include <algorithm>
  6 
  7 class Lottery
  8 {
  9 public:
 10     std::vector<std::string> sortByOdds(std::vector<std::string> rules)
 11     {
 12         std::vector<std::string> name;
 13         std::vector<int> choice;
 14         std::vector<int> blank;
 15         std::vector<std::string> sorted;
 16         std::vector<std::string> unique;
 17         long long n[rules.size()];
 18 
 19         for (int i = 0; i != rules.size(); i++) {
 20             int posColon = rules[i].find(":");
 21             std::string s = rules[i];
 22             std::string iName = s.substr(0,posColon);
 23             std::string iPara = s.substr(posColon+2, s.size());
 24             std::cout << iPara << std::endl;
 25             name.push_back(iName);
 26 
 27             std::stringstream ss(iPara);
 28             std::string buf;
 29             std::vector<std::string> tokens;
 30             while (ss >> buf) {
 31                 tokens.push_back(buf);
 32             }
 33             choice.push_back(stoi(tokens[0]));
 34             blank.push_back(stoi(tokens[1]));
 35             sorted.push_back(tokens[2]);
 36             unique.push_back(tokens[3]);
 37         }
 38 
 39         for (int i = 0; i != rules.size(); i++) {
 40             n[i] = compute_odds(choice[i],blank[i],sorted[i],unique[i]);
 41             std::cout << n[i] << std::endl;
 42         }
 43 
 44         sort_result(name,n);
 45 
 46         return name;
 47     }
 48 
 49 private:
 50     long long compute_odds(int n, int k, std::string s, std::string u) {
 51         long long p;
 52         bool isSorted = s == "T" ? true : false;
 53         bool isUnique = u == "T" ? true : false;
 54 
 55         if (isSorted && isUnique)
 56             p = nchoosek(n,k);
 57         else if (isSorted && !isUnique)
 58             p = nchoosek(n+k-1,k);
 59         else if (!isSorted && !isUnique)
 60             p = pow(n,k);
 61         else if (!isSorted && isUnique)
 62             p = nchoosek(n,k) * factorial(k);
 63 
 64         return p;
 65     }
 66 
 67 
 68     long long pow(int n, int k) {
 69         long long p = 1;
 70         for (int i = 1; i <= k; i++) {
 71             p *= n;
 72         }
 73         return p;
 74     }
 75 
 76 
 77     long long factorial(int k) {
 78         long long p = 1;
 79         for (int i = 1; i <= k; i++) {
 80             p *= i;
 81         }
 82         return p;
 83     }
 84 
 85 
 86     long long factorial(int n, int k) {
 87         long long p = 1;
 88         for (int i = n; i > n-k; i--) {
 89             p *= i;
 90         }
 91         return p;
 92     }
 93 
 94 
 95     long long nchoosek(int n, int k) {
 96         long long p = factorial(n,k) / factorial(k);
 97         return p;
 98     }
 99 
100 
101     void sort_result(std::vector<std::string> & name, long long *n) {
102         // bubble sort
103         for (int i = 0; i != name.size()-1; i++) {
104             bool swapped = false;
105             for (int j = 0; j != name.size()-1; j++) {
106                 if (n[j] > n[j+1] || (n[j] == n[j+1] && name[j] > name[j+1])) {
107                     swap(name[j], name[j+1]);
108                     swap(n[j], n[j+1]);
109                     swapped = true;
110                 }
111             }
112             if (swapped == false) {
113                 break;
114             }
115         }
116     }
117 
118     template <class T> void swap(T &a, T &b) {
119         T c(a);
120         a = b;
121         b = c;
122     }
123 
124 };
125 
126 
127 int main(int argc, char** argv)
128 {
129     std::vector<std::string> test1;
130     test1.push_back("PICK ANY TWO: 10 2 F F");
131     test1.push_back("PICK TWO IN ORDER: 10 2 T F");
132     test1.push_back("PICK TWO DIFFERENT: 10 2 F T");
133     test1.push_back("PICK TWO LIMITED: 10 2 T T");
134     std::vector<std::string> test2;
135     test2.push_back("INDIGO: 93 8 T F");
136     test2.push_back("ORANGE: 29 8 F T");
137     test2.push_back("VIOLET: 76 6 F F");
138     test2.push_back("BLUE: 100 8 T T");
139     test2.push_back("RED: 99 8 T T");
140     test2.push_back("GREEN: 78 6 F T");
141     test2.push_back("YELLOW: 75 6 F F");
142     Lottery lot;
143     std::vector<std::string> res = lot.sortByOdds(test2);
144 
145     for (int i = 0; i != res.size(); i++) {
146         std::cout << res[i] << std::endl;
147     }
148 
149     return 0;
150 }
550 Points

 

  

TopCoder Practice SRM 144 Div 1

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/texzhichen/p/4158927.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!