zoukankan      html  css  js  c++  java
  • SRM 573 DIV2

    1、照旧水题~~~,略过

    2、贪心算法

     1 #include <iostream> 
     2 #include <string> 
     3 #include <vector> 
     4 #include <cstdlib> 
     5 #include <cmath> 
     6 #include <map> 
     7 #include <stack> 
     8 #include <algorithm> 
     9 #include <list> 
    10 #include <ctime> 
    11 #include <set> 
    12 #include <queue> 
    13 typedef long long ll; 
    14 using namespace std; 
    15 
    16 class TeamContestEasy { 
    17 public: 
    18   int worstRank(vector <int> str){ 
    19     int sz=str.size(); 
    20     int point=str[1]+str[2]+str[0]-min(str[0],min(str[1],str[2])); 
    21     if(3==sz) 
    22       return 1; 
    23     vector<int> part(sz-3,0); 
    24     copy(str.begin()+3,str.end(),part.begin()); 
    25     sort(part.begin(),part.end()); 
    26     reverse(part.begin(),part.end()); 
    27     int sz2=part.size()-1; 
    28     int szo=part.size()/3; 
    29     int start=0; 
    30     int res=0; 
    31 /* 
    32     for(int i=0;i<=sz2;i++) 
    33       cout<<part[i]<<endl; 
    34 */ 
    35     while(start<sz2){ 
    36       if((part[start]+part[sz2])>point){ 
    37         res++; 
    38         start++; 
    39         sz2--; 
    40       }else{ 
    41         sz2--; 
    42       } 
    43     } 
    44     if(res>szo) 
    45       res=szo; 
    46     return (res+1); 
    47 
    48   } 
    49 };

    3、DP的算法,简化一下,先求一个点Ai到达矩形内某个点Bi的路径数目,然后相乘就是到达所有点A到达点Bi的数目,将点Bi的数目相加就是总数目~~~

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 #include <cstdlib>
     5 #include <cmath>
     6 #include <map>
     7 #include <stack>
     8 #include <algorithm>
     9 #include <list>
    10 #include <ctime>
    11 #include <set>
    12 #include <queue>
    13 typedef long long ll;
    14 using namespace std;
    15 
    16 class WolfPackDivTwo {
    17 public:
    18     int calc(vector<int>, vector<int>, int);
    19 };
    20 
    21 #define maxnum 160
    22 #define MOD 1000000007
    23 int res[maxnum][maxnum];
    24 int dp[2][maxnum][maxnum];
    25 const int dx[] = { 0, 0, 1, -1 };
    26 const int dy[] = { 1, -1, 0, 0 };
    27 bool check(int x, int y) {
    28     return x >= 0 && x < maxnum && y >= 0 && y < maxnum;
    29 }
    30 int WolfPackDivTwo::calc(vector<int> x, vector<int> y, int m) {
    31 
    32     for (int j = 0; j < maxnum; j++) {
    33                 for (int k = 0; k < maxnum; k++) {
    34                     res[j][k] =1;
    35                 }
    36             }
    37     for (int i = 0; i < x.size(); i++) {
    38         for (int j = 0; j < maxnum; j++) {
    39             for (int k = 0; k < maxnum; k++) {
    40                 dp[0][j][k] = dp[1][j][k] = 0;
    41             }
    42         }
    43 
    44         dp[0][x[i] + 53][y[i] + 53] = 1;
    45         for (int t = 1; t < m + 1; t++) {
    46             int cur = t % 2;
    47             int pre = (t + 1) % 2;
    48             for (int j = x[i] + 53 - m - 1; j < x[i] + 53 + m + 1; j++) {
    49                 for (int k = y[i] + 53 - m - 1; k < y[i] + 53 + m + 1; k++) {
    50                     dp[cur][j][k] = 0;
    51                     for (int d = 0; d < 4; d++) {
    52                         int tx = j + dx[d];
    53                         int ty = k + dy[d];
    54                         if (check(tx, ty)) {
    55                             int t = dp[cur][j][k] + dp[pre][tx][ty];
    56                             dp[cur][j][k] = t % MOD;
    57                         }
    58                     }
    59                 }
    60 
    61             }
    62         }
    63         int tk = m % 2;
    64         for (int j = 0; j < maxnum; j++) {
    65             for (int k = 0; k < maxnum; k++) {
    66                 ll t = (ll) res[j][k] * (ll) dp[tk][j][k];
    67                 res[j][k] = t % MOD;
    68             }
    69         }
    70     }
    71 
    72     int ans = 0;
    73 
    74     for (int i = 0; i < maxnum; i++) {
    75         for (int j = 0; j < maxnum; j++) {
    76             ans += res[i][j];
    77             ans = ans % MOD;
    78 
    79         }
    80     }
    81     int resk = ans % MOD;
    82     return resk;
    83 
    84 }
  • 相关阅读:
    Ubuntu 32下Android NDK+NEON的配置过程及简单使用举例
    java环境变量配置
    实现TextView 文字排版,分散两端对齐
    cmd 控制台 提示:请求的操作须要提升!
    怎样将程序猿写出来的程序打包成安装包(最简单的)
    二分查找
    32位Linux文件限制大小
    Windows ICS 服务无法启动问题解决
    Microsoft.AlphaImageLoader滤镜解说
    memset函数具体说明
  • 原文地址:https://www.cnblogs.com/kakamilan/p/2963234.html
Copyright © 2011-2022 走看看