加入一直乘以二加上去的话只能构造到的时候就超过了
所以需要考虑为奇数的情况的操作
发现每一次递归下去都会让函数值
也就是说,奇数和偶数的函数变换只是让函数值而已,那么显然是选择奇数的变换更优
也就是说我们倒推回去,一直执行和
就能得到最小的
这么构造最优,预处理即可
发现最大能构造到
然而我这个***,一开始把奇数的
这么转换之后,就再也没看出什么规律。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[209];
signed main()
{
memset( a,-1,sizeof a );
int temp = 2; a[1] = 1; a[2] = 2;
for(int i=3;i<=120;i++)
if( !(i&1) ) a[i] = temp-1,temp-=1;
else a[i] = temp*2,temp*=2;
int t,x; cin >> t;
while( t-- )
{
int x; cin >> x;
if( x>120 ) printf("-1\n");
else printf("%lld\n",a[x] );
}
} 
京公网安备 11010502036488号