【規律】【貪心】【數學】HDU 5573 Binary Tree
阿新 • • 發佈:2019-02-07
題目連結:
題目大意:
從1走到第k層,下一層的數是上一層的數*2或者*2+1,可以選擇加上或者減去走的數,最終要求結果為n
輸出每層走的數,和是加還是減
題目思路:
【規律】【貪心】【數學】
首先苦思冥想一下,發現,1 2 4 8...2k可以湊成任意的奇數。而偶數只需要把2k變為2k+1。
(從k往1位考慮加減,把+看為1,-看為0,則1+2+4+...=2k-1,符號可以用二進位制數X表示,為1111111...,每次X-1,則原式的答案-2)
(如+1+2+4+8=24-1=15,X=1111,則當X=1110時,表示-1+2+4+8=13,X=1101時,表示+1-2+4+8=11,以此類推可以得到任意奇數,偶數同理)
所以可以從2k往前推,當前值比n大就去-,小就取+。
// //by coolxxx // #include<iostream> #include<algorithm> #include<string> #include<iomanip> #include<memory.h> #include<time.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stdbool.h> #include<math.h> #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) #define abs(a) ((a)>0?(a):(-(a))) #define lowbit(a) (a&(-a)) #define sqr(a) ((a)*(a)) #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b)) #define eps 1e-8 #define J 10 #define MAX 0x7f7f7f7f #define PI 3.1415926535897 #define N 77 using namespace std; int cas,cass; long long n,m,lll,ans; long long e[N]; void print(int top,int x) { if(top==0) { if(x<n)puts("1 +"); else puts("1 -"); return; } if(x>n) { print(top-1,x-e[top]); printf("%lld -\n",e[top]); } else { print(top-1,x+e[top]); printf("%lld +\n",e[top]); } } int main() { #ifndef ONLINE_JUDGE // freopen("1.txt","r",stdin); // freopen("2.txt","w",stdout); #endif int i,j,k; // while(~scanf("%s",s1)) // while(~scanf("%d",&n)) for(e[0]=1,i=1;i<=61;i++) e[i]=e[i-1]<<1; for(scanf("%d",&cas),cass=1;cass<=cas;cass++) { printf("Case #%d:\n",cass); scanf("%lld%lld",&n,&m); m--; if(n&1) { print(m-1,e[m]); printf("%lld +\n",e[m]); } else { print(m-1,e[m]+1); printf("%lld +\n",e[m]+1); } } return 0; } /* // // */