题意:给出你F0、F1、F2以及Fn=Fn-1+' f '、 给出你串S,S串是首位相连的、问S串在F里面选择最少用多少个Fi组成,必须将整个S串分解完毕、如果不能分解完毕那么输出-1、
思路:模拟,将每个c的字符的位置求出来,因为c与c之间一定最少有两个f如果没有两个f那么一定是-1、 最后一个c与第一个c之间距离几个f特殊处理便可、
还有两种特殊情况,一种是全为f的情况,如果是这种情况,那么我一定要尽可能的用F2来切割,如果剩余一个那么就用F1,否则全部都用F2、
还有一种情况是,如果S串中有其他的字符串,那么肯定是不可以的,因为题意要求只能用F来分解,并且要全部分解完毕、所以这种情况一定是-1、
在这祝福与我一样在ACM努力的同道在网络名额赛取得好成绩!
AC代码:
#include<cstdio>
#include<cstring>
const int maxn =100010*2;
char str[maxn];
int vis[maxn];
int len;
int cnt,cnf;
int sum;
int tmd;
int falg;
int main()
{
int T;
scanf("%d",&T);
tmd=1;
while(T--){
scanf("%s",&str[1]);
memset(vis,0,sizeof(vis));
len=strlen(&str[1]); cnt=0; sum=0; falg=0; cnf=0;
for(int i=1;i<=len;i++){
if(str[i]=='f')
cnf++;
else if(str[i]=='c'){
vis[cnt++]=cnf;
cnf=0;
}
else{
falg=1;
}
}
if(cnt==0){
if(len%2==0)
sum+=cnf/2;
else
sum+=cnf/2+1;
}
for(int i=0;i<cnt;i++){
if(i==0){
if(cnf+vis[i]<2){
falg=1;break;
}
sum++;
}
else{
if(vis[i]<2){
falg=1;break;
}
sum++;
}
}
printf("Case #%d: ",tmd++);
if(!falg)
printf("%d\n",sum);
else
printf("-1\n");
}
return 0;
}