一串首尾相连的珠子(m个),有N种颜色(N<=10),取出其中一段,要求包含所有N中颜色,并使长度最短

#include <time.h> #include <stdlib.h> #include <vector> #include <iostream> using namespace std; void createRandArr(int *, int, int); void printfRandArr(int* , int); int countMaxUnique(int* , int); int getMaxCoverLen(int* , int, int); //生成随机数组 void createRandArr(int* randArr, int len, int top=10) { srand((int)time(0)); for (int i = 0; i < len; ++i) { randArr[i] = rand()%top; } } //输出随机数组 void printfRandArr(int* randArr, int len) { for (int i = 0; i < len; ++i) { cout << randArr[i] << " "; } cout << endl; } //求出数组中不同元素的个数 int countMaxUnique(int* arr, int len) { int ret = 0; int i, j; bool flag = true; for (i = 0; i < len; ++i) { flag = true; for (j = 0; j < i; ++j) { if (arr[j] == arr[i]) { flag = false; break; } } if (flag) { ++ret; } } return ret; } //以index为起点,环形扫描数组,返回最大覆盖的长度 int getMaxCoverLen(int* arr, int len, int index) { vector<int> maxCoverSeq; //保存以index为起始,并有最大覆盖的数 vector<int> maxUniqueSeq; //保存以index为起始,不相同的数 int maxCover = countMaxUnique(arr, len); int count = 0; //数组不同数,计数 bool flag = true; int i,j,k; // from index to end for (i = index; i < len; ++i) { flag = true; maxCoverSeq.push_back(arr[i]); for (j = index; j < i; ++j) { if (arr[j] == arr[i]) { flag = false; break; } } if (flag) { ++count; maxUniqueSeq.push_back(arr[i]); } if (count == maxCover) { return maxCoverSeq.size(); } } //from begin to index for (i = 0; i < index; ++i) { flag = true; maxCoverSeq.push_back(arr[i]); for (k = 0; k < maxUniqueSeq.size(); ++k) { if (arr[i] == maxUniqueSeq[k]) { flag = false; break; } } if (flag) { ++count; maxUniqueSeq.push_back(arr[i]); } if (count == maxCover) { return maxCoverSeq.size(); } } return maxCoverSeq.size(); } int main(int argc, char* argv[]) { int arr[15]; int len = sizeof(arr) / sizeof(int); createRandArr(arr, len, 15); int ret = countMaxUnique(arr, len); cout << "random array is: " << endl; printfRandArr(arr,len); cout << "arr len = " << len << ", unique = " << ret << endl; cout << endl; int i; int min = 10000; int index = 0; //循环求最小 for (i = 0; i < len; ++i) { ret = getMaxCoverLen(arr, len, i); if (ret < min) { min = ret; index = i; } } cout << "min = " << min << ", index at " << index << endl; if (min + index > len) { for (i = index; i < len; ++i) { cout << arr[i] << " "; } for (i = 0; i < min + index - len; ++i) { cout << arr[i] << " "; } cout << endl; } else { for (i = index; i < index + min; ++i) { cout << arr[i] << " " ; } } cout << endl; return 0; } //结果

你可能感兴趣的:(Random,include)