两道与二进制有关的sequence
生活随笔
收集整理的這篇文章主要介紹了
两道与二进制有关的sequence
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目(第四題第五題)
題目有兩個操作,x/2和x-1,很容易就想到和二進制有關,但具體關系是什么呢。
可以考慮x/2和x-1都是左移的操作,于是就可以發現X開頭的有趣數列中的數都是x的二進制前綴。
例如 111 110 11 10 1 0
那么判斷[a,b]中的有趣數列是不是含有k,只需要把k當做前綴然后取和區間[a,b]相交的部分就可以了。
這個程序寫得好丑= =。
View Code 1 program Neayo; 2 const 3 inf='sequence.in'; 4 ouf='sequence.out'; 5 var 6 i,j,t:longint; 7 k,a,b,ans,kk:int64; 8 function min(a,b:int64):int64; 9 begin 10 if a<b then exit(a) else exit(b); 11 end; 12 procedure init; 13 begin 14 assign(input,inf);assign(output,ouf); 15 reset(input);rewrite(output); 16 readln(t); 17 for t:=1 to t do 18 begin 19 readln(k,a,b); 20 ans:=0; 21 if k>=b then 22 begin 23 if k>b then writeln(0) else writeln(1); 24 continue; 25 end; 26 if k=0 then 27 begin 28 writeln(b-a+1); 29 continue; 30 end; 31 if k>=a then 32 begin 33 a:=k; 34 inc(ans); 35 if (not odd(k))and(k+1<=b)then inc(ans); 36 end; 37 kk:=k; 38 if not odd(kk) then 39 begin 40 kk:=kk+1; 41 if (kk>=a)and(k<a) then inc(ans); 42 end; 43 while k<b do 44 begin 45 k:=k shl 1; 46 kk:=(kk shl 1)+1; 47 if k>b then break; 48 if k>=a then ans:=ans+min(kk,b)-k+1; 49 if (k<a)and(kk>=a) then ans:=ans+min(kk,b)-a+1; 50 end; 51 writeln(ans); 52 end; 53 close(input); 54 end; 55 begin 56 init; 57 close(output); 58 end.乍一看和上一道題好像。。。
貪心地分析可發現至少需要減max次(max為初始序列中最大的數),至多也只要減max次。因為如果把最大的數*2的話顯然會增多很多次數。
于是有這樣一個性質x-a/y-a是隨著a的增大而減小的,那么對于那些x/max>1/2的數字,總會有個時候使x-a/max-a=1/2,那么我們只需要對它們*2就行了。
對于比max/2還要小的數,就先把它們變得比max/2大,再按照相同步驟處理。
View Code program Neayo; constinf='sequence.in';ouf='sequence.out'; vari,j,k,n:longint;max,ans:int64;half,tmp:extended;a:array[0..200001]of int64;procedure init; beginassign(input,inf);assign(output,ouf);reset(input);rewrite(output);readln(n);for i:=1 to n dobeginreadln(a[i]);if a[i]>max then max:=a[i];end;tmp:=max;half:=tmp/2;for i:=1 to n doif a[i]<max thenbegintmp:=a[i];inc(ans);while tmp<half dobegintmp:=tmp*2;inc(ans);end;end;inc(ans,max);writeln(ans);close(input); end;begininit;close(output); end.轉載于:https://www.cnblogs.com/neayo/archive/2012/11/06/2757320.html
總結
以上是生活随笔為你收集整理的两道与二进制有关的sequence的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对于接口的理解
- 下一篇: JavaScript中的私有成员