方法一
#include<iostream> //应用模拟的方法进行操作,不过要开一个比较大的数组
#include<stdio.h>
#include<string>
#include<string.h>
using namespace std;
const int maxn = 20;
int s[1<<maxn];
int main()
{
int d,I;
while(scanf("%d%d",&d,&I)==2)
{
memset(s,0,sizeof(s));
int k = 1;
int n = (1<<d-1)-1;
for(int i = 1; i <= I;i++)
{
k = 1;
for(;;)
{
s[k]= !s[k];
if(s[k])
k = k * 2;
else
k = k*2+1;
if(k >= n)break;
}
}
printf("%d\n",k);
}
return 0;
}
方法二
解析:题目中只是让你输出第I个球的位置,如果I是奇数时,他是往左走的第(I+1)/2个,如果是偶数时,他是往右走的第I/2个
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
int D,I;
while(scanf("%d%d",&D,&I)==2)
{
int k = 1;
int n = 1<<D-1;
for(int i= 0; i < D-1; i++ )
{
if(I%2==1)
{
k = k*2;
I =(I+1)/2;
}
else
{
k= k*2+1;
I=I/2;
}
}
cout<<k<<endl;
}
return 0;
}
uva 679 小球下落
最新推荐文章于 2021-12-12 01:08:37 发布