傳送門
加入一直乘以二加上去的話只能構造到 60 60 60的時候就超過了 1 e 18 1e18 1e18
所以需要考慮為奇數的情況的操作
發現每一次遞回下去都會讓函式值 + 1 +1 +1
也就是說,奇數和偶數的函式變換只是讓函式值 + 1 +1 +1而已,那么顯然是選擇奇數的變換更優 ! ! ! !!! !!!
也就是說我們倒推回去,一直執行 ? 2 *2 ?2和 ? 1 -1 ?1就能得到最小的 x x x
這么構造最優,預處理即可
發現最大能構造到 120 120 120
然而我這個煞筆,一開始把奇數的 f ( x ) = f ( x + 1 ) + 1 = f ( x + 1 2 ) + 2 f(x)=f(x+1)+1=f(\frac{x+1}{2})+2 f(x)=f(x+1)+1=f(2x+1?)+2
這么轉換之后,就再也沒看出什么規律,
#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] );
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/244325.html
標籤:其他
上一篇:【Java實作】劍指offer29——順時針列印二維陣列(LeetCode54:螺旋矩陣)
下一篇:C語言編程>第十二周 ① 請撰寫函式fun,該函式的功能是:移動字串中的內容,移動的規則如下:把第1到第n個字符,平移到字串的最后,把第n+1到最后的字符移到字串的前部。
