您的位置:首页 > 其它

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

2010-12-03 16:08 585 查看
#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
相关文章推荐