趣味比赛
发布时间: 2017年12月12日 16:36 最后更新: 2017年12月12日 16:44 时间限制: 1000ms 内存限制: 128M SPJ
小明参加了学校举办的火眼金睛趣味比赛,比赛的规则是这样的:由若干男生和若干女生组成的队伍站成一排,小明要在最短的时间内在队伍中找到一个人,这个人前面的男生的个数等于从他开始的队伍(包含他自己)中女生的个数。小明现在很头疼,比赛方规定小明可以求助好友,作为他的好朋友,请你帮帮他。 输出要求的人的位置,若不存在输出No Response
第一行是一个整数T代表测试用例组数。
每个测试用例的第一行是一个整数n代表队伍长度;第二行是一个长度为n的字符串,使用M代表男生,F代表女生。题目保证字符串合法(即不含其他字母)。(1<=n<=1e6)(人从0开始编号)
对于每个测试用例输出要求的位置,若位置不存在则输出 “No Response”(不含分号)。若有多个位置满足题意则输出任意一个。
1 2 MF
1
代码
竟然一直没有意识到 如MM 的情况,此时应该输出0!!!!!!!!!!!!!
下为1.0版,执行结果RunTime Error.
1 #include <stdio.h> 2 int main(){ 3 int n,m,x,y; 4 int i = 0,j,k; 5 char people[100000]; 6 7 scanf("%d",&n); 8 while(i < n){ 9 scanf("%d",&m); 10 getchar(); 11 scanf("%s",people); 12 people[m] = ''; 13 if(m < 2){ 14 printf("No Response"); 15 if(i != n-1) 16 printf(" "); 17 continue; 18 } 19 j = 1; 20 while(j < m){ 21 k = 0; 22 x = 0; 23 y = 0; 24 while(k < m){ 25 if(k < j){ 26 if(people[k] == 'M') 27 x++; 28 }else{ 29 if(people[k] == 'F') 30 y++; 31 } 32 k++; 33 } 34 if(x == y && x != 0){ 35 printf("%d",j); 36 break; 37 } 38 j++; 39 } 40 if(j == m && x != y) <<<<<<<<<<<<<<<---------------- 41 printf("No Response"); 42 if(i != n-1) 43 printf(" "); 44 i++; 45 } 46 return 0; 47 }
下为编程论坛 rjsp 版主提供的解决方案
我写的简直渣到爆。。看看人家写的优雅的不要不要的
1 #include <stdio.h> 2 3 int main( void ) 4 { 5 unsigned t; 6 scanf( "%u", &t ); 7 while( t-- ) 8 { 9 unsigned n; 10 scanf( "%u", &n ); 11 char team[1000001]; 12 scanf( "%s", team ); 13 14 unsigned f_num = 0; 15 for( size_t i=0; team[i]; ++i ) 16 if( team[i] == 'F' ) 17 ++f_num; 18 19 unsigned m_num=0, index; 20 for( index=0; team[index] && m_num<f_num; ++index ) 21 { 22 if( team[index] == 'F' ) 23 --f_num; 24 else 25 ++m_num; 26 } 27 if( team[index] && m_num==f_num ) 28 printf( " %u ", index ); 29 else 30 puts( "No Response" ); 31 } 32 }
在接下来是编程论坛 九转星河 版主给出的另一种思路
补充一下~
好像只有全部女生的时候没有位置~
其实还可以用头尾指针向中间靠拢的方法,两个指针相遇的位置就是所求位置~
再次感谢各位大神的帮助,我也会更努力的!