题目大意:给你一个n,然后从1~n隔一个选一个,挑出一个集合然后从集合中继续隔一个挑一个,直到只有一个数,问最后一个数是多少?2<=n<=1050
例如n=5,先选出2,4最后选择4。n=12,先选出2,4,6,8,10,12,再选出4,8,12在选出8。
可以发现这个数字一定是偶数,并且是比n小中被2除最多次的一个数,所以发现就是找一个2的幂次的小于n的最大的数。代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
string a[];
int t[];
bool judge(string n,string a)
{
if(n.size()<a.size())
return true;
else if(n.size()==a.size())
{
for(int i=; i<a.size(); i++)
{
if(n[i]<a[i])
return true;
if(n[i]>a[i])
return false;
}
}
return false;
} string fun(string a)
{ memset(t,,sizeof(t));
for(int i=; i<=a.size(); i++)
t[i]=(a[a.size()-i]-'')*;
for(int i=; i<=a.size(); i++)
if(t[i]>=)
{
t[i+]+=t[i]/;
t[i]=t[i]%;
}
int len=a.size()+;
string a1;
while(t[len]==)
{
len--;
}
for(int i=len; i>=; i--)
{
a1+=(''+t[i]);
}
return a1;
} int main()
{
int t;
cin>>t;
string n;
a[]+='';
while(t--)
{
cin>>n;
for(int i=;; i++)
{
if(judge(n,a[i]))
{
cout<<a[i-]<<endl;
break;
}
else
{
if(a[i+].size()==)
a[i+]=fun(a[i]);
}
}
}
}