Topcoder SRM 144 Lottery

Div1 550 Lottery

题意:

买彩票,给定一些彩票的描述:choice,blanks,sorted,unique,choice代表彩票的每个数码的最大值,blank代表彩票号码由几个数码组成,sorted代表彩票的数码是否是呈升序的,unique代表彩票的数码是否两两不唯一。

根据这些描述,可以求出合法的彩票号码的数量,也就可以求出中奖概率,将彩票按照中奖概率排序。

题解:

组合数学

未排序,不唯一:choice! 每个数码都有choice种选择

排序,唯一:C(choice,blanks) 从choice个数中选blanks个

不排序,唯一:C(choice,blanks)*(blanks!) 在上一个的基础上,还可以对这选出的blanks个做全排序

排序,不唯一:C(choice+blanks-1,blanks) 按照官方题解,考虑choice+blanks-1个球,对其中choice-1个染色,对于不染色的球,它的权值等于左边染色球的个数+1,对于这些权值,就构造出了一系列长度为blanks,单调不减的序列。

#line 2 "Lottery.cpp"
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

struct Node
{
    string s;
    LL p;

    bool operator < (const Node& A) const
    {
        if (p!=A.p) return p<A.p;
        else return s<A.s;
    }
};

vector <string> ans;
Node L[60];
LL C[125];
LL fac[15];

LL f(LL n,LL m)
{
    if (m>n) return 0;

    C[0]=1;
    for (int i=1;i<=m;++i)
    {
        C[i]=C[i-1]*(n-i+1)/i;
    }
    return C[m];
}

class Lottery
{
    public:
    vector <string> sortByOdds(vector <string> rules)
    {
        int sz=rules.size();
        if (sz==0)
        {
            return ans;
        }

        fac[1]=1;
        for (int i=2;i<=9;++i) fac[i]=fac[i-1]*i;

        for (int i=0;i<=sz-1;++i)
        {
            stringstream ss(rules[i]);
            LL choice,blanks;
            char S,U;

            getline(ss,L[i].s,‘:‘);
            ss>>choice>>blanks>>S>>U;

            if (S==‘F‘ && U==‘F‘)
            {
                L[i].p=1;
                for (int j=1;j<=blanks;++j)
                    L[i].p*=choice;
            }
            else if (S==‘F‘ && U==‘T‘)
            {
                L[i].p=f(choice,blanks)*fac[blanks];
            }
            else if (S==‘T‘ && U==‘F‘)
            {
                L[i].p=f(choice+blanks-1,blanks);
            }
            else if (S==‘T‘ && U==‘T‘)
            {
                L[i].p=f(choice,blanks);
            }
            //cout<<choice<<‘ ‘<<blanks<<endl;
        }

        sort(L,L+sz);
        for (int i=0;i<=sz-1;++i)
        {
            ans.push_back(L[i].s);
            //cout<<L[i].p<<endl;
        }

        return ans;
    }
};

#ifdef ex
int main()
{
    #ifdef ex1
    freopen ("in.txt","r",stdin);
    #endif

}
#endif
时间: 2024-10-10 07:07:30

Topcoder SRM 144 Lottery的相关文章

Topcoder SRM 144 DIV 1

BinaryCode 模拟 题意是:定义串P,Q,其中Q[i]=P[i-1]+P[i]+P[i+1],边界取0,并且P必须是01串.现在给你Q,让你求出P. 做法是:枚举第一位是1还是0,然后就可以推到出P[i]=Q[i-1]-P[i-1]-P[i-2],需要注意一下边界就好. Lottery 组合数学 题意是:给你四种买彩票,将他们的中奖概率排序,这四种彩票都是从1到a中取b个数字,第一种是随便取,第二种是选取的必须是有序的,第三种是选取的必须是不同的,第四种是选取的必须是有序且不同的. 做法

Topcoder SRM 144

Div2 1100 PowerOutage 题意:给定一个有根树,求遍历完整棵树的最小路程 题解:DFS一下,求出叶子节点中到根节点的最远距离,然后把树的所有边相加,乘以二,减去最远距离就是答案 #line 2 "PowerOutage.cpp" #include<bits/stdc++.h> using namespace std; typedef long long LL; const int maxn=50; struct Edge { int to; int w;

TopCoder SRM 144 DIV 2

200: Problem Statement   Computers tend to store dates and times as single numbers which represent the number of seconds or milliseconds since a particular date. Your task in this problem is to write a method whatTime, which takes an int, seconds, re

TopCoder SRM 625 Incrementing Sequence 题解

本题就是给出一个数k和一个数组,包括N个元素,通过每次增加数组中的一个数的操作,最后需要得到1 - N的一个序列,不用排序. 可以从暴力法入手,然后优化. 这里利用hash表进行优化,最终得到时间效率是O(n*n)的算法,而且常数项应该很低,速度还挺快的. 思路: 1 如果数组A[i]在1 -N 范围内,就利用bool B[]记录,这个数已经找到了: 2 如果A[i]的值之前已经找到了,那么就增加k操作,得到新的值A[i]+k,看这个值是否找到了,如果没找到,就使用B记录,如果之前已经找到了,那

Topcoder SRM 643 Div1 250&lt;peter_pan&gt;

Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*......*pn,我们假设p0,p1,...,pn是单调不降的,那么v里存储的是下标为偶数 的N的质因数p0,p2,p4,...,p(2k).现在要求写一个程序,返回一个vector<long long>ans; ans里存储的是p0,p1,p2,...,pn. Limits Time Limit(m

TopCoder SRM 634 Div.2[ABC]

TopCoder SRM 634 Div.2[ABC] ACM 题目地址: TopCoder SRM 634 赛后做的,感觉现场肯定做不出来Orz,简直不能多说. Level One-MountainRanges[水题] 题意: 问序列中有几个完全大于旁边的峰. 分析: 傻逼题,不多说. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * File: one.cpp * Create Date: 2014-09-26 21:01:23 * Desc

TopCoder SRM 628 DIV 2

250-point problem Problem Statement    Janusz is learning how to play chess. He is using the standard chessboard with 8 rows and 8 columns. Both the rows and the columns are numbered 0 through 7. Thus, we can describe each cell using its two coordina

topcoder SRM 618 DIV2 WritingWords

只需要对word遍历一遍即可 int write(string word) { int cnt = 0; for(int i = 0 ; i < word.length(); ++ i){ cnt+=word[i]-'A'+1; } return cnt; } topcoder SRM 618 DIV2 WritingWords,布布扣,bubuko.com

topcoder SRM 618 DIV2 MovingRooksDiv2

一开始Y1,Y2两个参数看不懂,再看一遍题目后才知道,vector<int>索引代表是行数,值代表的是列 此题数据量不大,直接深度搜索即可 注意这里深度搜索的访问标识不是以前的索引和元素,而是一个交换元素后的整个状态vector<int>,这样可以避免重复元素的搜索 set<vector<int> > visit; bool flag; void dfs(vector<int>& src, vector<int>& d