cf 1511 D. Min Cost String
题意:
我们规定一个字符串的费用为存在一个i和j(i<j),然后s[i] = =s[j] && s[i+1] = =s[j+1],组成字符串的字符必须是前k位
现在给你字符串的长度n和k,怎样构造使得费用最少
题解:
其实第一个样例就已经把答案说出来了。。
比赛时自己想的很近了,但是就是差一点,唉
构造题等告诉答案就很简单了
为了让费用最少,我们要尽可能实现更多的两两字符的组合
所以我们可以这样构造,比如k为4,我们先让a与b,c,d分别组合,然后b再和,c,d组合,然后 。。。这样
但是这是其实还漏了一个情况,可以让a和b组合+a和c组合+a和d组合,当然aa也是可以的
所以答案就是:aabacadbbcbd…
这样构造出来是没有费用的,有可能n很大,所以这个答案不断复制,直到长度大于n,然后输出前n项
(不难,但是一开始没想到)
代码:
#include<bits/stdc++.h>
#define debug(x,y) printf("%s = %d\n",x,y);
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
int main()
{int n,k;cin>>n>>k;string s;for(int i=0;i<k;i++){s+='a'+i;for(int j=i+1;j<k;j++){s+='a'+i;s+='a'+j;}}while(s.size()<n)s+=s;s.resize(n);cout<<s<<endl;
}
/*
a abacad b bcbd
*/