topcoder算法练习2
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:
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 |
|||||||||||||
|
|||||||||||||
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) | |||||||||||||
|
|||||||||||||
| 1) | |||||||||||||
|
|||||||||||||
| 2) | |||||||||||||
|
|||||||||||||
总的来说此题不难,就是组合数学题
#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的更多相关文章
- topcoder算法练习3
SRM144 DIV1 1100 point Problem Statement NOTE: There are images in the examples section of this ...
- ITWorld:2014年全球最杰出的14位编程天才
近日,ITWorld 整理全球最杰出的 14 位程序员,一起来看下让我们膜拜的这些大神都有哪些?(排名不分先后) 1.Jon Skeet 个人名望:程序技术问答网站 Stack Overflow 总排 ...
- BFS/DFS算法介绍与实现(转)
广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比 ...
- IT求职中,笔试、面试的算法准备
PS:此文章为转载,源地址:http://www.newsmth.net/nForum/#!article/CoderInterview/849 作者应该是在美国进行的笔试面试,感觉面试的的公 ...
- *[topcoder]LCMSetEasy
http://community.topcoder.com/stat?c=problem_statement&pm=13040 DFS集合全排列+LCM和GCD.但事实上,有更简单的算法,列在 ...
- *[topcoder]LittleElephantAndBalls
http://community.topcoder.com/stat?c=problem_statement&pm=12758&rd=15704 topcoder的题经常需要找规律,而 ...
- [topcoder]KingdomReorganization
http://community.topcoder.com/stat?c=problem_statement&pm=11282&rd=14724 这道题是最小生成树,但怎么转化是关键. ...
- [topcoder]ActivateGame
http://community.topcoder.com/stat?c=problem_statement&pm=10750&rd=14153 http://apps.topcode ...
- [topcoder]BestRoads
http://community.topcoder.com/stat?c=problem_statement&pm=10172&rd=13515 http://community.to ...
随机推荐
- Unity Chan Advanced
1. 8X MSAA 2. SMAA 3. ViewSpace Outline 4. Unity Chan Skin 5. Shift Toon Lighting 6. DOF 7. Bloom
- HDOJ 2017 字符串统计
Problem Description 对于给定的一个字符串,统计其中数字字符出现的次数. Input 输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组 ...
- God of War - HDU 2809(状态压缩+模拟)
题目大意:貌似是一个游戏,首先给出卢布的攻击,防御,还有血量,再给出每升一级增加的攻击防御还有血量,然后又N个敌人,杀死每个敌人都会得到一些经验,求杀死完所有敌人时剩余的最大血量. 分析:因为敌人比较 ...
- Java做界面的感想。。
我用Swing做出的例子: JavaFX做出的界面: 后来又做出了自己编写的一套基于Synth的L&F,其与直接在代码中重绘某个组件不同,最大优点是具有可插拔性,即在不改变原有程序代码的情况下 ...
- 406. Queue Reconstruction by Height
一开始backtrack,设计了很多剪枝情况,还是TLE了 ..后来用PQ做的. 其实上面DFS做到一半的时候意识到应该用PQ做,但是不确定会不会TLE,就继续了,然后果然TLE了.. PQ的做法和剪 ...
- 一个Hibernate小程序
基本步骤 在前一篇博文Hibernate环境搭建中为大家详细的介绍如何搭建一个学习新类库的学习环境.今天,为大家带来一个Hibernate小例子,让大家能够快速上手. 步骤如下: 1.配置hibern ...
- 【设计模式 - 3】之建造者模式(Builder)
1 模式简介 建造者模式也叫生成器模式,和抽象工厂模式相似,也是一种构建复杂对象的模式. 建造者模式中的角色分类: 抽象建造者Builder:接口类型,用于规范各个产品的组成部分: 具体建造 ...
- Android常用网址[转]
转自:http://my.oschina.net/u/593225/blog/404423 1.AndroidDevTools URL: http://www.androiddevtools.cn/ ...
- c++ timer基于win消息队列
能够承载10w个timer通信执行,说关闭就关闭,里面用了一个比較巧妙的线程处理,呵呵10W个timer就10多个线程,请大牛不要笑话,供新手学习之用 #pragma once #include &l ...
- java按照集合中元素的属性进行排序示例代码
public class Student { private String name; private int age; private int id; public Student() { sup ...