hdu 5455 Fang Fang
F题 Fang Fang
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5455
题意:F0 = f
F1 = ff
F2 = cff
后面的每一个在前一个基础上加一个f
求一个字符串首尾相连最少用多少个F可以表示完
思路:分有c和无c的情况,无c时则全部由F0 和F1 组成
有c时则考虑c后的f个数至少为2, 首尾的f可单独计数再比较(
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 #include <cstring> 6 7 using namespace std; 8 9 const int N = 1e6 + 10; 10 char str[N], ch[2]; 11 12 int main() 13 { 14 int t,ca = 0, ans; 15 cin>>t; 16 while(t -- ){ 17 ca ++ ; 18 ans = 0; 19 printf("Case #%d: ", ca); 20 int flag1 = 0;//flag1首有多少f,flag3中有多少f 21 bool flag2 = false;//flag2:是否遇见c 22 scanf("%s", str); 23 gets(ch); 24 bool f = true; 25 int l = strlen(str); 26 for(int i = 0, j = 1; i < l; i += j, j = 1){ 27 int flag3 = 0; 28 29 if(!flag2 && str[i] == 'f') flag1 ++ ; 30 else flag2 = true; 31 if(flag2){ 32 while(str[i+j] == 'f'){ 33 flag3 ++ ; 34 j ++ ; 35 } 36 if(flag3 <= 1 && i + j <= l - 1) f = false; 37 38 if((i == l - 1 && str[i] == 'c') || (i + j == l)){ 39 if(flag3 + flag1 <= 1) f = false; 40 } 41 if(!f) break; 42 else ans ++ ; 43 } 44 if(!flag2 && i == l - 1){ 45 if(flag1 % 2 == 1) ans = flag1 / 2 + 1; 46 else ans = flag1 / 2; 47 } 48 } 49 if(f) printf("%d\n", ans); 50 else printf("-1\n"); 51 } 52 return 0; 53 }
一以贯之的努力 不得懈怠的人生 每天的微小积累会决定最终结果 ————————裴之
欢迎加我QQ:1136244161一起讨论,共同进步