聪明猪Tom及其家人和其他猪群居,他们面临凶恶屠户Thomas,Thomas有一个嗜好,他喜欢将群居的猪排成一行,首先将处于奇数位置的猪送到屠宰场,剩下的猪自然成为新的一行。
在新的一行中,再次将处于单数位置的猪送到屠宰场,如此重复多次。
从键盘上输入所有猪的个数m(假设m不超过100),Tom及家人的个数n,求解Tom及家人应该站的最佳位置,输出这些位置。
编号从1开始,运行结果:
代码:
#include <stdio.h>
int main()
{
int m, n;
int i, j;
int ps[200]={0};
int left, t;
scanf("%d %d", &m, &n);
for (i = 1; i <= m; i++)
ps[i] = 1;
left = m ;
while (left > n)
{
t = 0;
for (i = 1; i <= m; i++)
{
if (ps[i] == 1)
{
t++;
if (t % 2 == 1)
{
ps[i] = 0;
left--;
if (left == n)
{
for (j = 1; j <= m; j++)
{
if (ps[j] == 1)
{
printf("%d ", j);
}
}
return 0;
}
}
}
}
}
for (j = 1; j <= m; j++)
{
if (ps[j] == 1)
{
printf("%d ", j);
}
}
return 0;
}
最佳位置?就是最后被屠杀的n个位置呗?
定义一个数组,记录每次循环奇数位的位置,然后倒序输出n个位置
#include <stdio.h>
int main()
{
int s[100]={0},n,m,b[100],j=0;
scanf("%d%d",&m,&n);
int count = 0;
while(j<m)
{
count = 0;
for(int i=0;i<m;i++)
{
if(s[i] == 0)
{
count++;
if(count%2==1)
{
b[j++] = i;
s[i] = 1;
}
}
}
}
for(int i=m-1;i>=m-n;i--)
printf("%d ",b[i]+1);
return 0;
}