• SRM 504.5 DIV2


    250pt:水题,大意是你现在拥有一些钱,为jackpot,你有一些朋友,他们各自也有一些钱,为money[],现在你每次从你的钱当中拿出1分给你朋友中钱最少的那个,直到你没有钱为止;硬搞就行了~

    View Code
    1 bool cmp(constint& a, constint& b)
    2 {
    3 return a < b;
    4 }
    5
    6  class TheJackpotDivTwo {
    7  public:
    8 vector <int> find(vector <int> money, int jackpot) {
    9 int size = money.size();
    10 while(jackpot >0)
    11 {
    12 int idx =-1;
    13 for(int i =0;i < size;i++)
    14 if(idx ==-1|| money[idx] > money[i])
    15 idx = i;
    16 money[idx]++;
    17 jackpot--;
    18 }
    19
    20 sort(money.begin(), money.end(), cmp);
    21
    22 return money;
    23 }
    24 };

    500pt:水题,大意是以4或者7结尾的数字称为lucky number,现在给你一个数n,求最少需要几个lucky number使其和为n,如果不能组成,返回-1,;这题因为4、7结尾的数均为lucky number,那么其实只需考虑个位就行了~

    View Code
    1 class TheNumbersWithLuckyLastDigit {
    2  public:
    3 int find(int n) {
    4 int ans =-1;
    5 for(int i =0;i <10;i++)
    6 for(int j =0;j <10;j++)
    7 {
    8 int val =4* i +7* j;
    9 if(val %10== n %10&& n >= val && i + j >0&& (ans ==-1|| ans > i + j))
    10 ans = i + j;
    11 }
    12 return ans;
    13 }
    14 };

    1000pt:大意为现在有n个人组成的一个队列,有一张篮球票要通过掷骰子的方式来决定给谁,规则是,每轮掷一次骰子,如果点数为4,那么把这张票给队列第一个人并结束,否则,如果点数为奇数,那么队列第一个人就站到队列最后一个位置去,如果点数是偶数,那么队列第一个人就从队列中删除,不再加入队列,如果这样进行了k轮之后还没有决定出把票给谁,那么直接将票给当前队列的第一个人。问,一开始队列中的第m个人得到票得概率;这题数据规模较小,可以搜索、dp,当时我写的时候dp状态设计的有些挫,其实完全没有必要……

    我的状态设计是dp[i][j][k]表示第i轮时开始时队列第j个人在当前队列第一个位置,并且队列状态为k(状态压缩,其实这是没有必要的)的概率。

    View Code
    1 constint maxN =11;
    2  constint maxM = (1<< maxN);
    3
    4  double dp[maxN][maxN][maxM];
    5
    6  class TheTicketsDivTwo {
    7 public:
    8 double find(int nn, int mm, int kk) {
    9 if(kk +1< mm) return0;
    10
    11 int lim = (1<< nn);
    12 memset(dp, 0, sizeof(dp));
    13 dp[0][0][lim -1] =1;
    14 for(int i =1;i <= kk;i++)
    15 for(int j =0;j < nn;j++)
    16 for(int k = lim -1;k >=0;k--)
    17 if(k & (1<< j))
    18 {
    19 int cnt =0;
    20 for(int m =0;m < nn;m++)
    21 if(k & (1<< m))
    22 cnt++;
    23 if(cnt <2) continue;
    24
    25 for(int m = (j +1) % nn;;m = (m +1) % nn)
    26 if((k & (1<< m)) && m != j)
    27 {
    28 dp[i][m][k] += dp[i -1][j][k] *1.0/2.0;
    29 dp[i][m][k & (~(1<< j))] += dp[i -1][j][k] *1.0/3.0;
    30 break;
    31 }
    32 }
    33
    34 double ans =0;
    35 for(int i =0;i < kk;i++)
    36 for(int k =0;k < lim;k++)
    37 {
    38 if(k == (1<< (mm -1)))
    39 ans += dp[i][mm -1][k];
    40 else
    41 ans += dp[i][mm -1][k] *1.0/6.0;
    42 }
    43 for(int k =0;k < lim;k++)
    44 ans += dp[kk][mm -1][k];
    45
    46 return ans;
    47 }
    48 };
  • 相关阅读:
    Java中Date和Calender类的使用方法
    看《做性能测试需要做些什么》
    【笔记】jquery append,appendTo,prepend,prependTo 介绍
    【实践】jquery实现滑动动画及轮播
    【实践】四联联动 + 更加优化
    【实践】jQuery实现三联联动
    关于导入excel报错的处理(xls,xlsx)
    递归算法及经典案例
    验证身份证真假
    正则表达式
  • 原文地址:https://www.cnblogs.com/debugcool/p/SRM1.html
Copyright © 2020-2023  润新知