都是基础题目,代码也起来也挺绕的
串珠
作为一个手串艺人,有金主向你订购了一条包含n个杂色串珠的手串——每个串珠要么无色,要么涂了若干种颜色。为了使手串的色彩看起来不那么单调,金主要求,手串上的任意一种颜色(不包含无色),在任意连续的m个串珠里至多出现一次(注意这里手串是一个环形)。手串上的颜色一共有c种。现在按顺时针序告诉你n个串珠的手串上,每个串珠用所包含的颜色分别有哪些。请你判断该手串上有多少种颜色不符合要求。即询问有多少种颜色在任意连续m个串珠中出现了至少两次。
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int n,m,c,num,color,cnt=0;
cin >> n >> m >> c;
int b[n];
int a[n][c+1];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
{
cin >> num;
for(int j=0;j<num;j++)
{
cin >> color;
a[i][color] = 1;
}
}
for(int j=1;j<=c;j++)
{
int k=0;
for(int i=0;i<n;i++)
{
if(a[i][j] == 1)
b[k++] = i+1;
}
if(k != 1)
{
for(int i=0;i<k-1;i++)
{
if( b[i+1]-b[i] < m)
{
cnt++;
break;
}
}
}
}
cout << cnt <<endl;
return 0;
}
交换字母连续最长
【编码题】字符串S由小写字母构成,长度为n。定义一种操作,每次都可以挑选字符串中任意的两个相邻字母进行交换。询问在至多交换m次之后,字符串中最多有多少个连续的位置上的字母相同?
#include <iostream>
#include <string>
#include <fstream>
#include <array>
#include <vector>
#include <algorithm>
#include <sstream>
#include <numeric>
#include <iterator>
#include <map>
#include <memory>
using namespace std;
int dp(int i, int j, vector<int> &p, map<pair<int, int>, int> &memo)
{
if (memo.find(make_pair(i, j)) != memo.end())
{
return memo[make_pair(i, j)];
}
if (i == j)
{
memo[make_pair(i, j)] = 0;
return 0;
}
else if (i + 1 == j)
{
memo[make_pair(i, j)] = p[j] - p[i] - 1;
return p[j] - p[i] - 1;
}
else
{
int temp = dp(i + 1, j - 1, p, memo) + ((p[j] - p[i] - 1) - (j - i - 1));
memo[make_pair(i, j)] = temp;
return temp;
}
}
int main()
{
vector<vector<int>> record(26, vector<int>(0));
string s;
int m;
cin >> s >> m;
for (int i = 0; i < s.size(); ++i)
{
record[s[i] - 'a'].push_back(i);
}
int maximum = -1;
for (vector<int> & v : record)
{
map<pair<int, int>, int> memo;
int size = v.size();
for (int i = 0; i < size; ++i)
{
for (int j = i + 1; j < size; ++j)
{
int t = dp(i, j, v, memo);
if (t <= m)
{
if ((j - i + 1) > maximum)
{
maximum = (j - i + 1);
}
}
}
}
}
cout << maximum << endl;
// system("pause");
return 0;
}