SRM466

250pt:

     给出一个数n(n <= 10^10),问至少修改几位能使其变成完全平方数。

思路:
    直接枚举平方根,然后统计。
    注意枚举时要枚举到比她大。。
 1 #line 7 "LotteryCheating.cpp"
 2 #include <cstdlib>
 3 #include <cctype>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <vector>
 9 #include <string>
10 #include <iostream>
11 #include <sstream>
12 #include <map>
13 #include <set>
14 #include <queue>
15 #include <stack>
16 #include <fstream>
17 #include <numeric>
18 #include <iomanip>
19 #include <bitset>
20 #include <list>
21 #include <stdexcept>
22 #include <functional>
23 #include <utility>
24 #include <ctime>
25 using namespace std;
26 
27 #define PB push_back
28 #define MP make_pair
29 
30 #define REP(i,n) for(i=0;i<(n);++i)
31 #define FOR(i,l,h) for(i=(l);i<=(h);++i)
32 #define FORD(i,h,l) for(i=(h);i>=(l);--i)
33 
34 typedef vector<int> VI;
35 typedef vector<string> VS;
36 typedef vector<double> VD;
37 typedef long long LL;
38 typedef pair<int,int> PII;
39 
40 
41 class LotteryCheating
42 {
43         public:
44         int bit[20], L = 0;
45         int work(long long x){
46              int ret = 0;
47              for (int i = 0; i < L + 1; ++i){
48                    if (x % 10 != bit[i]) ++ret;
49                    x /= 10;
50              }  
51              return ret;
52         }
53         int minimalChange(string ID)
54         {
55                int sz = ID.size();
56                L = sz;
57                memset(bit, 0, sizeof(bit)); 
58                long long n = 0;
59                for (int i = 0; i < sz; ++i)
60                   n = n * 10 + ID[i] - 48, bit[sz-i-1] = ID[i] - 48;
61                int ans = 100;
62                for (long long i = 0; i * i <= n * 10; ++i)
63                   ans = min(work(i * i), ans);
64                return ans;   
65           
66         }
67         
68 
69 };
View Code

 

500pt:
     彩票上有N行5列的格子,其中有1-5*N的排列。抽奖会抽出5个数来,如果彩票上一行有超过三个抽出的数则中奖。
问彩票中奖概率。
思路:
     直接枚举中奖的情形,那么有可能是3行 2行,1行。
     对于3行,只有可能是3+1+1,
     对于2行,4 + 1
     对于1行,5
    其他全排列即可
 1 #line 7 "LotteryPyaterochka.cpp"
 2 #include <cstdlib>
 3 #include <cctype>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <vector>
 9 #include <string>
10 #include <iostream>
11 #include <sstream>
12 #include <map>
13 #include <set>
14 #include <queue>
15 #include <stack>
16 #include <fstream>
17 #include <numeric>
18 #include <iomanip>
19 #include <bitset>
20 #include <list>
21 #include <stdexcept>
22 #include <functional>
23 #include <utility>
24 #include <ctime>
25 using namespace std;
26 
27 #define PB push_back
28 #define MP make_pair
29 
30 #define REP(i,n) for(i=0;i<(n);++i)
31 #define FOR(i,l,h) for(i=(l);i<=(h);++i)
32 #define FORD(i,h,l) for(i=(h);i>=(l);--i)
33 
34 typedef vector<int> VI;
35 typedef vector<string> VS;
36 typedef vector<double> VD;
37 typedef long long LL;
38 typedef pair<int,int> PII;
39 
40 
41 class LotteryPyaterochka
42 {
43         public:
44         double C(int n, int m){
45               double ret = 1.0;
46               for (int i = 1; i <= m; ++i)
47                  ret *= (n - i + 1.0) / (i + .0);
48               return ret;
49         }
50         double A(int n, int m){
51               double ret = 1.0;
52               for (int i = 1; i <= m; ++i)
53                  ret *= (n - i + 1.0);
54               return ret;
55         }
56         double chanceToWin(int N)
57         {
58               if (N <= 2) return 1.0;
59               double ans = 0;
60               ans += C(N, 1) * C(N - 1, 2) * C(5, 3) * C(5, 1) * C(5, 1) * A(5, 5);
61               ans += C(N, 1) * C(N - 1, 1) * C(5, 3) * C(5, 2) * A(5, 5);
62               ans += C(N, 1) * C(N - 1, 1) * C(5, 4) * C(5, 1) * A(5, 5); 
63               ans += C(N, 1) * A(5, 5);
64               cout << ans << endl;
65               for (int i = 0; i < 5; ++i)
66                  ans /= (5 * N - i + .0);
67               return ans;  
68         }
69 
70 };
View Code

 

posted on 2014-03-15 21:46  yzcstc  阅读(206)  评论(0编辑  收藏  举报