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
原文地址:https://www.cnblogs.com/yzcstc/p/3341197.html