试题编号: | 201712-2 |
试题名称: | 游戏 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述
有
n个小朋友围成一圈玩游戏,小朋友从1至
n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在
n号小朋友的顺时针方向。
游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为 k的倍数或其末位数(即数的个位)为 k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时,该小朋友获胜。 例如,当n=5, k=2时: 1号小朋友报数1; 2号小朋友报数2淘汰; 3号小朋友报数3; 4号小朋友报数4淘汰; 5号小朋友报数5; 1号小朋友报数6淘汰; 3号小朋友报数7; 5号小朋友报数8淘汰; 3号小朋友获胜。 给定 n和 k,请问最后获胜的小朋友编号为多少?
输入格式
输入一行,包括两个整数
n和
k,意义如题目所述。
输出格式
输出一行,包含一个整数,表示获胜的小朋友编号。
样例输入
5 2
样例输出
3
样例输入
7 3
样例输出
4
数据规模和约定
对于所有评测用例,1 ≤
n ≤ 1000,1 ≤
k ≤ 9。
|
第一版:没看到题目中的“k的倍数或其末位数(即数的个位)为k”末尾数……少了一个筛选条件
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n=0,k=0;
int i = 1;
int a[1000];
scanf("%d",&n);
scanf("%d",&k);
int num = n;
while(num != 1)
{
num = 0;
for(int j = 0;j<n;j++)
{
if(a[j]!=0)
{
if(i%k != 0)
a[j]=i;
else
a[j]=0;
i++;
}
}
for(int l = 0;l<n;l++)
{
if(a[l]!=0)
num++;
}
}
for(int j = 0;j<n;j++)
{
if(a[j]!=0)
{
printf("%d",j+1);
break;
}
}
return 0;
}
第二版:大概是循环太多……超时了QAQ
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n=0,k=0;
int i = 1;
int a[1005];
scanf("%d",&n);
scanf("%d",&k);
int num = n;
for(int b = 0;b<n;b++)
a[b]=1001;
while(num != 1)
{
num = 0;
for(int j = 0;j<n;j++)
{
if(a[j]!=0)
{
if( (i%k != 0) && (i%10 != k))
a[j]=i;
else
a[j]=0;
i++;
}
//printf("%d ",a[j]);
}
//printf("%d ",i);
for(int l = 0;l<n;l++)
{
if(a[l]!=0)
num++;
}
//printf("%d\n",num);
}
for(int j = 0;j<n;j++)
{
if(a[j]!=0)
{
printf("%d",j+1);
break;
}
}
return 0;
}
第三版:把将被选中的孩子筛出去的思路转变为标记被选中的孩子,以减少循环……顺利通过……
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int a[1005];
int main()
{
int n=0,k=0;
int i = 0;
scanf("%d",&n);
scanf("%d",&k);
int num = 0;
while(num != n-1)
{
for(int j = 0;j<n;j++)
{
if(a[j]==0)
{
i++;
if( (i%k == 0) || (i%10 == k))
{
a[j]=1;
num++;
if(num == n-1)
break;
}
}
}
}
for(int j = 0;j<n;j++)
{
if(a[j]!=1)
{
printf("%d",j+1);
break;
}
}
return 0;
}
总结:
有时候需要将题目中的说法换一个方向考虑,仔细读题。全局数组默认初始化为0。
P.S.将大数组定义在main函数外的原因:全局变量在静态存储区分配内存,局部变量是在栈上分配内存空间的。(c语言程序在运行时会动态创建一个堆栈段,里面存放着调用栈,保存着函数的调用关系和局部变量。)如果数组太大,可能会造成栈溢出。