您的位置:首页 > 其它

2017年浙江中医药大学程序设计竞赛 C、寻找zcmu

2018-03-12 09:40 330 查看
题目链接:https://www.nowcoder.com/acm/contest/61/C
flag:模拟
*我们设定数组a[4]:  表示当前遍历数组,此刻达到连续z、zc、zcm的状态需要删除的最少字符数目!
*遍历到z,就更新a[1]为0;
  遍历到c,因为a[1]中的z在之前zc的后面,所以此时的a[1]+c比a[2]的zc与后面的mu组合需要删除的数目更少;
     例:zcavzfdlfgc……mu,一看便知第一个zc需要删去数目比第2个zc要多从第一个c到第2个z的距离+2;
      a[2]=a[1];
 同理,遍历到m时,a[3]=a[2];
 遍历到u时,我们比较ans和a[3],得到最小值即可!

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

const int Size=1e5+10;
char s[Size];
int a[5];
int main(){
while(~scanf("%s",s)){
memset(a,-1,sizeof(a));

int str=strlen(s);
int ans=-1;
int j=0,temp=0;
for(int i=0;i<str;++i){
int flag=-1;
if(s[i]=='z'){a[1]=0;flag=1;}
else if(a[1]!=-1&&s[i]=='c'){a[2]=a[1];flag=2;}
else if(a[2]!=-1&&s[i]=='m'){a[3]=a[2];flag=3;}
else if(a[3]!=-1&&s[i]=='u'){ans=(ans==-1)?a[3]:min(ans,a[3]);a[3]=-1;}

for(int i=1;i<=3;++i)
if(a[i]!=-1&&flag!=i)++a[i];
}
printf("%d\n",ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐