zoukankan      html  css  js  c++  java
  • SRM477

    250pt:

    题意:给定一块蜂巢状的N*M矩阵,每块六边形和周围6个六边形相邻,现在告诉你哪些是陆地,哪些是水,问水陆交界处的长度。

    思路:直接模拟

    code:

     1 #line 7 "Islands.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 Islands
    42 {
    43         public:
    44         int beachLength(vector <string> S)
    45         {
    46              int ans = 0;
    47              int n = S.size(), m = S[0].size(), p;
    48              for (int i = 0; i < n; ++i)
    49                 for (int j = 0; j < m; ++j){
    50                      if (j > 0 && S[i][j] == '#' && S[i][j-1] == '.') ++ans;
    51                      if (j > 0 && S[i][j] == '.' && S[i][j-1] == '#') ++ans;
    52                      if (i == 0) continue;
    53                      if (i & 1) p = j;
    54                      else p = j - 1;
    55                      if (p >= 0 && S[i][j] == '.' && S[i-1][p] == '#') ++ans;
    56                      if (p >= 0 && S[i][j] == '#' && S[i-1][p] == '.') ++ans;  
    57                      if (p + 1 < m && S[i][j] == '.' && S[i-1][p+1] == '#') ++ans;
    58                      if (p + 1 < m && S[i][j] == '#' && S[i-1][p+1] == '.') ++ans; 
    59                 }
    60              return ans;
    61         }
    62   };   
    View Code

    500pt:

    题意:给定最多200个正整数,问最多能组成多少个勾股数对。勾股数对定义:对于互质数对(a, b),存在c,使得a*a+b*b=c*c,

    思路:隐蔽的二分图。

            很明显先求出勾股数对,那么接下来便是一个最大匹配了。

           不过,是二分图吗?

           对于奇数a与奇数b,由于互质,那么a^2+b^2必定是2的倍数,必然不存在c

           对于偶数a与偶数b,不互质显然不存在。 

      所以是个二分图,直接匹配即可

    code:

     1 #line 7 "PythTriplets.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 #define PB push_back
    27 #define MP make_pair
    28 #define REP(i,n) for(i=0;i<(n);++i)
    29 #define FOR(i,l,h) for(i=(l);i<=(h);++i)
    30 #define FORD(i,h,l) for(i=(h);i>=(l);--i)
    31 #define M0(a) memset(a, 0, sizeof(a))
    32 typedef vector<int> VI;
    33 typedef vector<string> VS;
    34 typedef vector<double> VD;
    35 typedef long long LL;
    36 typedef pair<int,int> PII;
    37 int match[210], g[210][210];
    38 int n, m;
    39 bool vis[210];
    40 class PythTriplets
    41 {
    42         public:
    43         vector<int> v1, v2;
    44         void makePoint(string &S){
    45              int tmp = 0;
    46              for (int i = 0; i < S.size(); ++i)
    47                 if (S[i] == ' '){
    48                      if (tmp == 0) continue;
    49                      if (tmp & 1) v1.push_back(tmp);
    50                      else v2.push_back(tmp);
    51                      tmp = 0;
    52                 } else tmp = tmp * 10 + S[i] - 48;
    53              if (tmp > 0){
    54                      if (tmp & 1) v1.push_back(tmp);
    55                      else v2.push_back(tmp);
    56              }
    57         }
    58         LL gcd(LL a, LL b){
    59               return b ? gcd(b, a % b) : a;
    60         }
    61         bool ok(long long a, long long b){
    62               if (gcd(a, b) > 1) return false;
    63               long long c = floor(sqrt(a * a + b * b + .0));
    64               if (c * c < a * a + b * b) ++c;
    65               if (a * a + b * b == c * c) return true;
    66               return false;
    67         }
    68         bool search_path(int u){
    69              for (int v = 0; v < m; ++v) if (g[u][v] && !vis[v]){
    70                    vis[v] = true;
    71                    if (match[v] == -1 || search_path(match[v])){
    72                          match[v] = u;
    73                          return true;
    74                    }
    75              }
    76              return false;
    77         }
    78         int findMax(vector <string> stick)
    79         {
    80             v1.clear();
    81             v2.clear();
    82             string S = accumulate(stick.begin(), stick.end(), string(""));
    83             makePoint(S);
    84             n = v1.size();
    85             m = v2.size();
    86             M0(g);
    87             for (int i = 0; i < n; ++i)
    88                for (int j = 0; j < m; ++j)
    89                   if (ok(v1[i], v2[j])) g[i][j] = true;//, cout << v1[i] <<  " " << v2[j] << endl;
    90             int ans = 0;
    91             memset(match, -1, sizeof(match));
    92             for (int i = 0; i < n; ++i){
    93                   M0(vis);
    94                   if (search_path(i)) ++ ans;
    95             }
    96             return ans;
    97         }
    98 };
    View Code
  • 相关阅读:
    [noip2013]华容道
    [tyvj 1061] Mobile Service (线性dp 滚动数组)
    [bzoj 2726] 任务安排 (斜率优化 线性dp)
    [洛谷 P2365] 任务安排 (线性dp)
    [poj 3666] Making the Grade (离散化 线性dp)
    【模板】manacher算法
    [tyvj 1071] LCIS
    [NOIP 2012] 国王游戏
    [NOIP 2010] 关押罪犯 (二分+二分图判定 || 并查集)
    [NOI 2002] 银河英雄传说 (带权并查集)
  • 原文地址:https://www.cnblogs.com/yzcstc/p/3627023.html
Copyright © 2011-2022 走看看