250pt:水题,大意是你现在拥有一些钱,为jackpot,你有一些朋友,他们各自也有一些钱,为money[],现在你每次从你的钱当中拿出1分给你朋友中钱最少的那个,直到你没有钱为止;硬搞就行了~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 };
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,那么其实只需考虑个位就行了~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 };
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(状态压缩,其实这是没有必要的)的概率。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 };
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 };