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