日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

两道与二进制有关的sequence

發布時間:2025/4/16 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两道与二进制有关的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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。