观看世界杯
题目详情:
为了缓解同学们的学习压力,Tan老师决定组织大家去看一场世界杯的足球赛。由于那天别的班级也要去,所以每个班只分配了一列的座位,也就是说Tan老师的学生只能占指定的那一列中的座位。球赛马上要开始了,Tan老师看到自己班上的的学生并不是连续的坐着(因为有的同学不喜欢看,所以可能就坐在后面了),但为了使同学们表现的有纪律,要求大家尽可能向前排的空座位移动,这里Tan老师想到一个好的idea,那就是就此给同学们出一个题目,如果答对了那就改天再看一场,没答对就不看。
Tan老师的题目是这样的:
就学生最开始占位的状态,要求同学们自己向最前面移动,但是要求一个同学一次移动最大的距离不能超过m,求同学们最少的移动次数达到上面所说的有纪律的状态。
输入描述:
有多组测试数据,每组测试数据包含一个学生初始占位的状态字符串s(|s|<148)和m(0<m<=10),其中s中只含0或1(0表示空位,1表示该位置被占),并且s的右边是屏幕,m如上描述。
输出描述:
对于每组测数据输出相应的答案。
答题说明:
输入样例:
001101 2
00111 1
输出样例:
1
0
我写的程序程序如下:
#include "stdio.h"
#include "string.h"
#define MAX 148
void main()
{
char stu[MAX],*pstu;
int m,len,count,precount;
while(scanf("%s",stu) != EOF && scanf("%d",&m) != EOF)
{
len = strlen(stu);
pstu = &stu[len - 1];
count = 0;
while(1)
{
precount = count;
pstu = &stu[len - 1]; //pstu指点数组最后一元素
while(pstu != stu)
{
if(*pstu == '0') //如果某位置没人坐
{
if(*(pstu - m) == '1') //如果没有坐的位置后面的m个人有人坐则将此人坐到前面去
{
*pstu = '1';
*(pstu - m) = '0';
count ++; //移动资料加1
}
}
pstu --; //pstu指向前一个元素
}
if(precount == count) m--; //如果count没有增加,说明移动m个位置的情况不存在了,应移动m-1个位置
pstu = &stu[len - 1];
while(*pstu == '1' && pstu != stu) pstu--; //判断是否移动完毕
if(pstu == stu) break;
while(*pstu == '0' && pstu != stu) pstu--;
if(pstu == stu) break;
}
printf("%d",count);
}
}
仅供大家参考学习,不保证完全正确