• SRM387 div1


    250pt:

       题目:有一些盒子(不大于50个),每个盒子里有一些大理石(最多50种颜色),然后给定每个盒子里每种颜色大理石的个数(没有为0),求最少操作几步满足:

           1:最多只能一个盒子里有多种颜色,叫做jaker

           2:每种颜色最多位于一个一个非jaker的盒子里,且每个非jaker的盒子最多只含有一种颜色:

      移动一步可以移动一个盒子任意个石头到另外一个。。

     思路:如果我们枚举哪个是jaker,那么对于剩下来的盒子,就剩下要不要移动到jaker里的抉择了。。而且:

        1: 如果该盒子有多种颜色,那么一定要移动,全部移动到jaker里就行

        2: 如果该盒子有只有一种颜色,那么该颜色用过(就是在前面也有一个只有该颜色的)则必须移动,否者不移动

        3:空盒子不移动

    code:

      1 // BEGIN CUT HERE
      2 /*
      3 
      4 */
      5 // END CUT HERE
      6 #line 7 "MarblesRegroupingEasy.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 #define M0(a) memset(a, 0, sizeof(a))
     31 using namespace std;
     32 
     33 #define PB push_back
     34 #define MP make_pair
     35 
     36 #define REP(i,n) for(i=0;i<(n);++i)
     37 #define FOR(i,l,h) for(i=(l);i<=(h);++i)
     38 #define FORD(i,h,l) for(i=(h);i>=(l);--i)
     39 
     40 typedef vector<int> VI;
     41 typedef vector<string> VS;
     42 typedef vector<double> VD;
     43 typedef long long LL;
     44 typedef pair<int,int> PII;
     45 
     46 int vis[100], n, m;
     47 vector<string> a;
     48 int work(int nt){
     49      M0(vis);
     50      int ret = 0;
     51      for (int i = 0; i < n; ++i)
     52        if (i != nt){
     53          int cnt = 0, p = -1;
     54          for (int j = 0; j < m; ++j)
     55             if (a[i][j] != '0') ++cnt, p = j;
     56          if (cnt == 0) continue;
     57          else if (cnt > 1) ret ++;
     58          else {
     59              if (!vis[p]) vis[p] = 1;
     60              else ++ret;                   
     61          }
     62      }
     63      return ret;
     64 }
     65 
     66 class MarblesRegroupingEasy
     67 {
     68         public:
     69         int minMoves(vector <string> b)
     70         { 
     71              n = b.size();
     72              m = b[0].size();
     73              a = b;
     74              int ret = 100;
     75              for (int i = 0; i < n; ++i)
     76                 ret = min(ret, work(i));
     77              return ret;
     78         }
     79         
     80 // BEGIN CUT HERE
     81     public:
     82     void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); if ((Case == -1) || (Case == 4)) test_case_4(); }
     83     private:
     84     template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '"' << *iter << "","; os << " }"; return os.str(); }
     85     void verify_case(int Case, const int &Expected, const int &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "	Expected: "" << Expected << '"' << endl; cerr << "	Received: "" << Received << '"' << endl; } }
     86     void test_case_0() { string Arr0[] = {"20",
     87  "11"}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 0; verify_case(0, Arg1, minMoves(Arg0)); }
     88     void test_case_1() { string Arr0[] = {"11",
     89  "11",
     90  "10"}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 1; verify_case(1, Arg1, minMoves(Arg0)); }
     91     void test_case_2() { string Arr0[] = {"10",
     92  "10",
     93  "01",
     94  "01"}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 1; verify_case(2, Arg1, minMoves(Arg0)); }
     95     void test_case_3() { string Arr0[] = {"11",
     96  "11",
     97  "11",
     98  "10",
     99  "10",
    100  "01"}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 3; verify_case(3, Arg1, minMoves(Arg0)); }
    101     void test_case_4() { string Arr0[] = {"020008000070",
    102  "000004000000",
    103  "060000600000",
    104  "006000000362",
    105  "000720000000",
    106  "000040000000", 
    107  "004009003000",
    108  "000800000000", 
    109  "020030003000",
    110  "000500200000",
    111  "000000300000"}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 6; verify_case(4, Arg1, minMoves(Arg0)); }
    112 
    113 // END CUT HERE
    114 
    115 };
    116 
    117 // BEGIN CUT HERE
    118 int main()
    119 {
    120         MarblesRegroupingEasy ___test;
    121         ___test.run_test(-1);
    122     //    system("pause");
    123         return 0;
    124 }
    125 // END CUT HERE

    500pt:

     题目:给定一些一维坐标里的线段,问把他们可以分成多少个子集,每个,子集符合下面情况:

         1:任意一个不再子集里的线段与子集相交

         2.子集元素都不相交

     思路:

        因为坐标最大才100,所以以坐标进行统计(类似dp思想)

       直接看代码吗,

        不然不好说清楚,代码还是很短的。。

     1 // BEGIN CUT HERE
     2 /*
     3 
     4 */
     5 // END CUT HERE
     6 #line 7 "IntervalSubsets.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 
    32 #define PB push_back
    33 #define MP make_pair
    34 #define M0(a) memset(a, 0, sizeof(a))
    35 #define REP(i,n) for(i=0;i<(n);++i)
    36 #define FOR(i,l,h) for(i=(l);i<=(h);++i)
    37 #define FORD(i,h,l) for(i=(h);i>=(l);--i)
    38 
    39 typedef vector<int> VI;
    40 typedef vector<string> VS;
    41 typedef vector<double> VD;
    42 typedef long long LL;
    43 typedef pair<int,int> PII;
    44 int f[110];
    45 
    46 class IntervalSubsets
    47 {
    48         public:
    49         int numberOfSubsets(vector <int> start, vector <int> finish)
    50         {
    51              int n = start.size();
    52              M0(f);
    53              f[0] = 1;
    54              for (int i = 1; i <= 100; ++i){
    55                  int L = -1;
    56                  for (int j = 0; j < n; ++j)
    57                      if (finish[j] <= i) L = max(start[j], L);
    58                  if (L == -1) 
    59                         f[i] = f[i - 1];
    60                  else 
    61                     for (int j = 0; j < n; ++j)
    62                         if (finish[j] >= L && finish[j] <= i) f[i] += f[start[j] - 1]; 
    63              }
    64              return f[100];   
    65         }
    66         
    67 // BEGIN CUT HERE
    68     public:
    69     void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); if ((Case == -1) || (Case == 4)) test_case_4(); }
    70     private:
    71     template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '"' << *iter << "","; os << " }"; return os.str(); }
    72     void verify_case(int Case, const int &Expected, const int &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "	Expected: "" << Expected << '"' << endl; cerr << "	Received: "" << Received << '"' << endl; } }
    73     void test_case_0() { int Arr0[] = {68,25}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {75,64}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 1; verify_case(0, Arg2, numberOfSubsets(Arg0, Arg1)); }
    74     void test_case_1() { int Arr0[] = {4,2,3}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {4,5,3}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 2; verify_case(1, Arg2, numberOfSubsets(Arg0, Arg1)); }
    75     void test_case_2() { int Arr0[] = {3,4,3,2,1}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {4,5,4,5,5}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 5; verify_case(2, Arg2, numberOfSubsets(Arg0, Arg1)); }
    76     void test_case_3() { int Arr0[] = {2,3,4,4,4,4,2,2,1}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {3,5,4,5,4,5,3,2,4}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 14; verify_case(3, Arg2, numberOfSubsets(Arg0, Arg1)); }
    77     void test_case_4() { int Arr0[] = {1, 1, 3, 3}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {2, 2, 4, 4}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 4; verify_case(4, Arg2, numberOfSubsets(Arg0, Arg1)); }
    78 
    79 // END CUT HERE
    80 
    81 };
    82 
    83 // BEGIN CUT HERE
    84 int main()
    85 {
    86         IntervalSubsets ___test;
    87         ___test.run_test(-1);
    88      //   system("pause");
    89         return 0;
    90 }
    91 // END CUT HERE
  • 相关阅读:
    残奥会女坐式排球决赛
    Visual C++ 调试器伪变量
    Project Chameleon Work In Progress 3
    pku1496 Word Index
    pku1083 Moving Tables
    pku3273 Monthly Expense
    pku1189 钉子和小球
    pku1018 Communication System
    关于tomcat报Error listenerStart和Context [*] startup failed due to previous errors两个错误的总结 东师理想
    java客户端提交数据到memcached方法memcached+java+client个人总结 东师理想
  • 原文地址:https://www.cnblogs.com/yzcstc/p/3341197.html
Copyright © 2020-2023  润新知