题目来源:http://codeforces.com/problemset/problem/335/A
题目大意是给你一个字符串S,然后要你求另外一个字符串s (s的长度给定) 并且求出其最小个数sum,sum个字符串s可以组成S
先求出S的种类k,并且记录每个种类的个数
如果k>n,直接输出-1;
然后就暴力从sum=1开始;
求出每种字母需要存在s中的个数,累加起来 如果大于n 则sum++ 继续;
如果小于,则可以输出了
注意:输出的总长度得等于n 不能小于;
代码如下:
#include<iostream>
#include <string>
using namespace std;
string s;
int n,k=0,sum=1,len=0;
int f[35]={0};
int main()
{
cin>>s;
cin>>n;
for(int i=0;i<s.length();i++)
{
f[s[i]-'a']++;
}
for(int i=0;i<30;i++)
{
if(f[i])
k++;
}
if(k<=n)
{
while(1)
{
int need=0;
for(int i=0;i<30;i++)
{
if(f[i]) //记录每种字符需要的个数
{
need+=f[i]/sum;
if(f[i]%sum)
need++;
}
}
if(need<=n)
{
cout<<sum<<endl;
for(int x=0;x<30;x++)
{
int nn=0;
if(f[x])
{
nn+=f[x]/sum;
if(f[x]%sum)
nn++;
}
len+=nn;
for(int p=0;p<nn;p++)
cout<<(char)(x+'a');
}
if(len<n) // 如果输出长度小于n 得补全
for(int x=len;x<n;x++)
cout<<"a";
break;
}
sum++;
}
}
else
cout<<"-1";
cout<<endl;
}