zoukankan      html  css  js  c++  java
  • SRM483

    250pt

    题意:给定一个[0,1)间的实数,一个分母不超过maxDen的分数逼近。。

    思路:直接枚举。然后判断。

    code:

     1 #line 7 "BestApproximationDiv1.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 #define eps 1e-9
    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 BestApproximationDiv1
    42 {
    43         public:
    44         string findFraction(int maxDen, string number)
    45         {
    46                 int A = 0, B = 100000, C = 1;
    47                 for (int i = 1; i <= maxDen; ++i)
    48                     for (int j = 0; j < i; ++j){
    49                          double tmp = (j + .0) / (i + .0) + eps;
    50                          int cnt = 1;
    51                        //  if (i == 7 && j == 1){
    52                        //      cout << "fuck" << endl;      
    53                        //  }
    54                          for (int k = 0; k < 6; ++k){
    55                               tmp *= 10;
    56                               int x = floor(tmp);
    57                               tmp -= x;
    58                               if (x == number[k+2]-48) ++cnt;
    59                               else break;
    60                          }
    61                          if (cnt > C || (cnt == C && i < B)){
    62                                C = cnt;
    63                                A = j;
    64                                B = i;
    65                          }
    66                     }
    67                 string res(""), s;
    68                 stringstream ss;
    69                 ss << A;
    70                 ss >> s;
    71                 res += s + "/";
    72                 ss.clear();
    73                 ss << B;
    74                 ss >> s;
    75                 res += s;
    76                 res += " has ";
    77                 ss.clear();
    78                 ss << C;
    79                 ss >> s;
    80                 res += s;
    81                 res += " exact digits";
    82                 return res;
    83         }
    84 };
    View Code

    500pt

    题意:n<=50 个人排成1排,每个人都有一个抵抗值和影响力(均小于500),如果收买第i个人,那么跟他距离为k抵抗值的值减少influence[i] / 2^k。

           求最少收买都少人,使得每个人的抵抗值降为0.

    思路:刚开始确实往最大流甚至费用流想了。不过想了好久还是没想到怎么做。。

            后来看了题解才知道是dp。并且突破口是每个人最多影响他旁边的8个人(当然,也就最多左右8个人影响到他)

            所以,我们可以预处理出一个数组can[i][1 << 17]表示以i为中心的17个人的状态一直的情况下,第i个人是否抵抗值降为小于等于0

            那么我们设dp[i][mask]表示第i个人为中心的17个人的状态为mask情况下最少安排多少人

            那么我们就可以用dp[i][mask]转移到dp[i+1][mask>>1] 和dp[i+1][mask>>1|(1 << 16)](前提是can[i+1][mask>>1]和dp[i+1][mask>>1|(1 << 16)]为true)

    code:

     1 // BEGIN CUT HERE
     2 /*
     3 
     4 */
     5 // END CUT HERE
     6 #line 7 "TreesCount.cpp"
     7 #include <cstdlib>
     8 #include <cctype>
     9 #include <cstring>
    10 #include <cstdio>
    11 #include <cmath>
    12 #include <algorithm>
    13 #include <vector>
    14 #include <string>
    15 #include <iostream>
    16 #include <sstream>
    17 #include <map>
    18 #include <set>
    19 #include <queue>
    20 #include <stack>
    21 #include <fstream>
    22 #include <numeric>
    23 #include <iomanip>
    24 #include <bitset>
    25 #include <list>
    26 #include <stdexcept>
    27 #include <functional>
    28 #include <utility>
    29 #include <ctime>
    30 using namespace std;
    31 #define PB push_back
    32 #define MP make_pair
    33 #define Inf 0x3fffffff
    34 #define REP(i,n) for(i=0;i<(n);++i)
    35 #define FOR(i,l,h) for(i=(l);i<=(h);++i)
    36 #define FORD(i,h,l) for(i=(h);i>=(l);--i)
    37 #define M 1000000007
    38 typedef vector<int> VI;
    39 typedef vector<string> VS;
    40 typedef vector<double> VD;
    41 typedef long long LL;
    42 typedef pair<int,int> PII;
    43 
    44 
    45 class TreesCount
    46 {
    47         public:
    48         int d[120], dg[120];
    49         bool v[120];
    50         int count(vector <string> S)
    51         {
    52               int n = S.size();
    53               memset(dg, 0 , sizeof(dg));
    54               memset(v, 0, sizeof(v));
    55               for (int i = 0; i < n; ++i) d[i] = Inf;
    56               queue<int> q;
    57               q.push(0);
    58               d[0] = 0;
    59               dg[0] = 1;
    60               v[0] = true;
    61               int x, dst;
    62               while (!q.empty()){
    63                    x = q.front();
    64                    for (int y = 0; y < n; ++y){
    65                         dst = S[x][y] - '0';
    66                         if (dst > 0 && d[x] + dst <= d[y]){
    67                               if (d[x] + dst < d[y]){
    68                                       dg[y] = 1;
    69                                       d[y] = d[x] + dst;
    70                                       if (!v[y]) q.push(y), v[y] = true;
    71                               }
    72                               else ++dg[y];
    73                         }
    74                    }
    75                    v[x] = false;
    76                    q.pop();
    77               }
    78               long long ans = 1;
    79               for (int i = 0; i < n; ++i)
    80                  ans =  (ans * dg[i]) % M;
    81               return ans;
    82         }
    83 
    84 };
    View Code
  • 相关阅读:
    沈询:事务与分布式事务原理与实现
    c++ 幕客网
    Meet Dgraph — an open source, scalable, distributed, highly available and fast graph databas
    开发与系统管理----开发工具 左蓝
    奇虎360技术博客
    java 相关软件使用趋势
    长亭技术专栏 安全攻防技术分享
    tcp/ip RFC
    gentoo and arclinux
    孙鑫视频VC++深入详解学习笔记
  • 原文地址:https://www.cnblogs.com/yzcstc/p/3628544.html
Copyright © 2011-2022 走看看