Problem Statement

    

In most states, gamblers can choose from a wide variety of different lottery games. The rules of a lottery are defined by two integers (choices and blanks) and two boolean variables (sorted and unique). choices represents the highest valid number that you may use on your lottery ticket. (All integers between 1 and choices, inclusive, are valid and can appear on your ticket.) blanks represents the number of spots on your ticket where numbers can be written.

The sorted and unique variables indicate restrictions on the tickets you can create. If sorted is set to true, then the numbers on your ticket must be written in non-descending order. If sorted is set to false, then the numbers may be written in any order. Likewise, if unique is set to true, then each number you write on your ticket must be distinct. If unique is set to false, then repeats are allowed.

Here are some example lottery tickets, where choices = 15 and blanks = 4:

  • {3, 7, 12, 14} -- this ticket is unconditionally valid.
  • {13, 4, 1, 9} -- because the numbers are not in nondescending order, this ticket is valid only if sorted = false.
  • {8, 8, 8, 15} -- because there are repeated numbers, this ticket is valid only if unique = false.
  • {11, 6, 2, 6} -- this ticket is valid only if sorted = false and unique = false.

Given a list of lotteries and their corresponding rules, return a list of lottery names sorted by how easy they are to win. The probability that you will win a lottery is equal to (1 / (number of valid lottery tickets for that game)). The easiest lottery to win should appear at the front of the list. Ties should be broken alphabetically (see example 1).

Definition

    
Class: Lottery
Method: sortByOdds
Parameters: vector <string>
Returns: vector <string>
Method signature: vector <string> sortByOdds(vector <string> rules)
(be sure your method is public)
    
 

Constraints

- rules will contain between 0 and 50 elements, inclusive.
- Each element of rules will contain between 11 and 50 characters, inclusive.
- Each element of rules will be in the format "<NAME>:_<CHOICES>_<BLANKS>_<SORTED>_<UNIQUE>" (quotes for clarity). The underscore character represents exactly one space. The string will have no leading or trailing spaces.
- <NAME> will contain between 1 and 40 characters, inclusive, and will consist of only uppercase letters ('A'-'Z') and spaces (' '), with no leading or trailing spaces.
- <CHOICES> will be an integer between 10 and 100, inclusive, with no leading zeroes.
- <BLANKS> will be an integer between 1 and 8, inclusive, with no leading zeroes.
- <SORTED> will be either 'T' (true) or 'F' (false).
- <UNIQUE> will be either 'T' (true) or 'F' (false).
- No two elements in rules will have the same name.

Examples

0)  
    
{"PICK ANY TWO: 10 2 F F"
,"PICK TWO IN ORDER: 10 2 T F"
,"PICK TWO DIFFERENT: 10 2 F T"
,"PICK TWO LIMITED: 10 2 T T"}
Returns:
{ "PICK TWO LIMITED",
"PICK TWO IN ORDER",
"PICK TWO DIFFERENT",
"PICK ANY TWO" }

The "PICK ANY TWO" game lets either blank be a number from 1 to 10. Therefore, there are 10 * 10 = 100 possible tickets, and your odds of winning are 1/100.

The "PICK TWO IN ORDER" game means that the first number cannot be greater than the second number. This eliminates 45 possible tickets, leaving us with 55 valid ones. The odds of winning are 1/55.

The "PICK TWO DIFFERENT" game only disallows tickets where the first and second numbers are the same. There are 10 such tickets, leaving the odds of winning at 1/90.

Finally, the "PICK TWO LIMITED" game disallows an additional 10 tickets from the 45 disallowed in "PICK TWO IN ORDER". The odds of winning this game are 1/45.

1)  
    
{"INDIGO: 93 8 T F",
"ORANGE: 29 8 F T",
"VIOLET: 76 6 F F",
"BLUE: 100 8 T T",
"RED: 99 8 T T",
"GREEN: 78 6 F T",
"YELLOW: 75 6 F F"}
Returns: { "RED",  "ORANGE",  "YELLOW",  "GREEN",  "BLUE",  "INDIGO",  "VIOLET" }

Note that INDIGO and BLUE both have the exact same odds (1/186087894300). BLUE is listed first because it comes before INDIGO alphabetically.

2)  
    
{}
Returns: { }

Empty case

总的来说此题不难,就是组合数学题

#include <vector>
#include <string>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h> using namespace std; class Lottery {
public:
vector <string> sortByOdds(vector <string>);
void compileRule(string, string&, uint64_t&, uint64_t&, int&, int&);
uint64_t computeOdd(uint64_t, uint64_t, int, int);
vector<string> ascendOrder(uint64_t* ,string[], int);
}; vector <string> Lottery::sortByOdds(vector <string> rules) {
int len=rules.size();
int i;
string names[len];
uint64_t choices[len];
uint64_t blanks[len];
uint64_t odds[len];
int sorted[len];
int unique[len];
vector<string> result;
if(len==0){
return result;
}
for(i=0;i<len;i++){
compileRule(rules.at(i), names[i], choices[i], blanks[i], sorted[i], unique[i]);
}
for(i=0;i<len;i++){
odds[i] = computeOdd(choices[i], blanks[i], sorted[i], unique[i]);
}
result=ascendOrder(odds, names, len);
return result;
} void Lottery::compileRule(string rule, string& name, uint64_t& choice, uint64_t& blank, int& sorted, int&unique){
char *a = (char*)malloc(sizeof(char));
choice = 0;
blank = 0;
//extract name until find an :
string::iterator iter;
for(iter=rule.begin();*iter!=':';iter++){
*a=*iter;
name.append((const char*)a);
}
iter=iter+2;
//extract choice
for(;*iter!=' ';iter++){
choice=choice*10+*iter-48;
}
iter++;
//extract blank
for(;*iter!=' ';iter++){
blank=blank*10+*iter-48;
}
//printf("blank %d\n",blank);
iter++;
if(*iter=='T') sorted=1;
else sorted=0;
iter=iter+2;
if(*iter=='T') unique=1;
else unique=0;
//printf("choice %d, blank %d, sorted %d, unique %d\n",choice,blank, sorted, unique);
}
uint64_t Lottery::computeOdd(uint64_t choice, uint64_t blank, int sorted, int unique){
int i;
uint64_t result=1;
uint64_t tresult=1;
if(sorted == 0 && unique == 0){
for(i = 0;i<blank;i++){
result=result*choice;
}
}
if(sorted==1 && unique==0){
for(i = 0;i<blank;i++){
result=result*choice;
}
for(i=0;i<blank;i++){
tresult=tresult*(choice-i);
}
for(i=0;i<blank;i++){
tresult=tresult/(i+1);
}
result=result-tresult;
}
if(sorted==0 && unique==1){
for(i=0;i<blank;i++){
result=result*(choice-i);
}
}
if(sorted==1 && unique==1){
for(i=0;i<blank;i++){
result=result*(choice-i);
}
for(i=0;i<blank;i++){
result=result/(i+1);
}
}
printf("odd %d\n",result);
//printf("choice %d, blank %d, sorted %d, unique %d, odd %d\n",choice,blank, sorted, unique,result);
return result;
} vector<string> Lottery::ascendOrder(uint64_t* odd, string* names, int len){
uint64_t temp;
int order[len];
int i,j, torder;
vector<string> result;
for(i=0;i<len;i++)
order[i]=i;
for(i=0;i<len-1;i++){
for(j=0;j<len-1-i;j++){
if (odd[j]>odd[j+1]){
temp=odd[j];
odd[j]=odd[j+1];
odd[j+1]=temp;
torder=order[j];
order[j]=order[j+1];
order[j+1]=torder;
}
}
}
for(i=0;i<len;i++)
printf("%d ",odd[i]);
for(i=0;i<len;i++)
printf("%d ",order[i]);
for(i=0;i<len;i++){
result.push_back(names[order[i]]);
}
return result;
}

  

topcoder算法练习2的更多相关文章

  1. topcoder算法练习3

    SRM144 DIV1 1100 point Problem Statement      NOTE: There are images in the examples section of this ...

  2. ITWorld:2014年全球最杰出的14位编程天才

    近日,ITWorld 整理全球最杰出的 14 位程序员,一起来看下让我们膜拜的这些大神都有哪些?(排名不分先后) 1.Jon Skeet 个人名望:程序技术问答网站 Stack Overflow 总排 ...

  3. BFS/DFS算法介绍与实现(转)

    广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比 ...

  4. IT求职中,笔试、面试的算法准备

    PS:此文章为转载,源地址:http://www.newsmth.net/nForum/#!article/CoderInterview/849     作者应该是在美国进行的笔试面试,感觉面试的的公 ...

  5. *[topcoder]LCMSetEasy

    http://community.topcoder.com/stat?c=problem_statement&pm=13040 DFS集合全排列+LCM和GCD.但事实上,有更简单的算法,列在 ...

  6. *[topcoder]LittleElephantAndBalls

    http://community.topcoder.com/stat?c=problem_statement&pm=12758&rd=15704 topcoder的题经常需要找规律,而 ...

  7. [topcoder]KingdomReorganization

    http://community.topcoder.com/stat?c=problem_statement&pm=11282&rd=14724 这道题是最小生成树,但怎么转化是关键. ...

  8. [topcoder]ActivateGame

    http://community.topcoder.com/stat?c=problem_statement&pm=10750&rd=14153 http://apps.topcode ...

  9. [topcoder]BestRoads

    http://community.topcoder.com/stat?c=problem_statement&pm=10172&rd=13515 http://community.to ...

随机推荐

  1. (转载)Mysql中,SQL语句长度限制

    (转载)http://qjoycn.iteye.com/blog/1288435 今天发现了一个错误:Could not execute JDBC batch update 最后发现原因是SQL语句长 ...

  2. 6N137的使用

    (1)引脚图 (2)功能表 (3)内部结构图 信号从2.3脚输入,反向偏置的光敏二极管受光照后导通,经过电流电压转换,输入到与门一端,与门另一端为使能端.由于输入信号为集电极开路,需要加上拉电阻.当使 ...

  3. 炮兵阵地 - POJ 1185(状态压缩)

    分析:先枚举出来所有的合法状态(当N=10的时候合法状态最多也就60种),用当前状态匹配上一行和上上一行的状态去匹配,看是否可以.....复杂度100*60*60*60,也可以接受. 代码如下: == ...

  4. 一句话菜刀获取ip详细信息

    <?php $ip="你要查的ip"; $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip ...

  5. Gwt 整合FusionCharts及封装搜狗地图时出现的问题

    smartGwt 整合FusionCharts 把需要的.swf文件和FusionCharts.js放在war下面(路径就自己定了) 可以工程的html文件中引FusionCharts.js文件 也可 ...

  6. richTextBox1 转到行号

      private void button2_Click(object sender, EventArgs e) {     Win32CommonDialog.frm_GOTO frm = new  ...

  7. 写一个函数,参数为$n,生成一个数组,其元素为1~$n,各元素位置随机排列,不得重复

    function rand_array($n){ $array=range(1,$n); shuffle($array); return $array; }

  8. Raphaël.js学习笔记

    Rapheal.js 是一个矢量图绘图库.对于支持HTML5 SVG的浏览器使用SVG绘图,不支持SVG的IE(ie6,7,8)使用VML绘图.所以Raphael.js的兼容性非常好. Raphael ...

  9. css(动画,过渡,转换)

    css3动画 @keyframes 规定动画,必须定义动画的名称,动画时长的百分比,一个或多个css样式属性 以百分比来规定改变发生的时间,或者通过关键词"from"和" ...

  10. win7 下配置 java 环境变量

    首先,你应该已经安装了 java 的 JDK 了,笔者安装的是:jdk-7u7-windows-x64 接下来主要讲怎么配置 java 的环境变量,也是为了以后哪天自己忘记了做个备份 1.进入“计算机 ...