<center id="qkqgy"><optgroup id="qkqgy"></optgroup></center>
  • <menu id="qkqgy"></menu>
    <nav id="qkqgy"></nav>
    <xmp id="qkqgy"><nav id="qkqgy"></nav>
  • <xmp id="qkqgy"><menu id="qkqgy"></menu>
    <menu id="qkqgy"><menu id="qkqgy"></menu></menu>
    <tt id="qkqgy"><tt id="qkqgy"></tt></tt>

  • <>一、沙漠問題

    <>1、問題描述

    一輛吉普車來到1000km寬的沙漠邊沿。吉普車的耗油量為1L/km,總裝油量為500L。顯然,吉普車必須用自身油箱中的油在沙漠中設幾個臨時
    加油點,否則是通不過沙漠的。假設在沙漠邊沿有充足的汽油可供使用,那么吉普車應在哪些地方、建多大的臨的加油點,才能以最少的油耗穿過這塊沙漠?

    <>2、問題分析

    從這個題目來看,這是一個極限問題,求得是最少耗油的量,所以只有唯一答案。

    1、為了穿越這個沙漠,同時耗油量最少,那么吉普車就應該每次出發的時候都要滿油量出發。

    2、為了保證每一次都是滿油量的從每個臨時加油站出發,那么每一個臨時加油站的油量儲備都應該是500L的倍數。

    3、為了保證耗油量最少,每一次建立一個臨時加油站的時候,運輸的次數也是越少越好,減少重復的路段。

    4、如果這道題通過遞推法正推的話很難確定第一個臨時加油站的地點。

    5、所以這里我們用倒推法來做。

    6、假設我們已經到達了B點,這個時候B點的儲油量應該0,這是可以倒推C1點的儲油量應該為500L,這時候可以剛好到達終點B。好了現在我們知道C1點的儲油量了,也就知道了C1到B點的距離為500米。

    7、這時候我們應該想,如果向C1點運輸500L的油量,C2點應該存儲多少油呢?根據上面的步驟2(臨時加油站的油量儲備都應該是500L的倍數)和步驟3(運輸的次數也是越少越好,這里肯定是兩次或者兩次以上才能向C1點運輸500L油,這里取2次),那么我們就知道了C2點的儲油量應該是500L*2,也就是1000L油。這時,C2到C1的距離為500/3。

    8、如果想C2點運輸1000L的油,重復步驟7可知,C3點存儲油量為500×3L,C3到C2的距離為500/5。

    9、所以到達臨時加油站Cn的時候,儲油量應該是500×n,Cn到Cn-1的距離為500/2n-1。
    所以這里通過下面這個式子算出n:
    500+500/3+500/5+500/(2n-1) = 1000;
    然后就可以得出最少耗油量。

    <>3.實現
    public class Desert { public double totaldistance;//總長度 public double speed;
    //單位距離的油耗速度 public double oilper;//單次的最大負載 public void result(double total,
    double speed,double oilper) { this.oilper=oilper; this.speed=speed; this.
    totaldistance=total; //假設都是滿載行駛 double distance = oilper/speed;//每段路的距離 if(
    totaldistance<= distance) { System.out.println("總距離小于第一段距離,可以一次通過。"); }
    //需要設置補給站點,每個站點的存儲量為單次的最大負載的整數倍 double dis=distance; int i=0;//站點個數 while(dis <
    totaldistance) { //每一個站點的距離之和,即計算設置多少個站點才能通過totaldistance總長 i++; dis+=1.0/(2*i+1
    )*distance; } int num=i; double totalOil = 0; while(i>0) { dis-=distance/(2*i+1)
    ; i--; if(totalOil==0) { totalOil=oilper*i+(totaldistance-dis)*(2*i+1)/speed; }
    System.out.println("第"+(num-i)+"個站點為距離起點"+(totaldistance-dis)+"處,存儲量為"+oilper*i+
    "L"); } System.out.println("總耗油量為"+totalOil+"L"); } public static void main(
    String[] args) { double total=1000.0; double speed=1.0; double oilper=500.0;
    Desert desert=new Desert(); desert.result(total,speed,oilper); } }
    <>4.結果
    第1個站點為距離起點22.433122433122435處,存儲量為3000.0L 第2個站點為距離起點60.89466089466089處,存儲量為
    2500.0L 第3個站點為距離起點106.34920634920638處,存儲量為2000.0L 第4個站點為距離起點161.90476190476193
    處,存儲量為1500.0L 第5個站點為距離起點233.33333333333337處,存儲量為1000.0L 第6個站點為距離起點
    333.33333333333337處,存儲量為500.0L 第7個站點為距離起點500.0處,存儲量為0.0L 總耗油量為3291.630591630592L
    <>二、獄吏問題

    <>1、問題描述

    某王國對囚犯進行大赦,讓一獄吏n次通過一排鎖著的n間牢房,每通過一次按所定規則轉動門鎖,每轉動一次,原來鎖著的被打開,原來打開的被鎖上;通過n次后,門鎖開著的,牢房中的犯人放出,否則犯人不得獲釋.轉動門鎖的規則是這樣的,第一次通過牢房,要轉動每一把門鎖,即把全部鎖打開;第二次通過牢房時,從第二間開始轉動,每隔一間轉動一次;第k次通過牢房,從第k間開始轉動,每隔k-1
    間轉動一次;問通過n次后,哪些牢房的鎖仍然是打開的?

    <>2、問題分析

    牢房可以視作一個一元數組,1代表鎖著,0代表開鎖。
    規律:當鎖的標號為一個數的平方時,那么最后它會開著。

    <>3.實現
    public class Warder { public void WarderResult(int n) { //1表示鎖著,0表示開鎖 System.
    out.println("暴力法"); int room[] = new int[n]; int i; for (i=0;i<n;i++) {
    //初始狀態都是鎖著 room[i]=1; } System.out.println("牢房數為"+n+"時"); int k,j; for(i=1;i<=n;
    i++) { //i表示通過牢房次數 System.out.print("第"+i+"次通過牢房"); for(k=i;k<=n;k+=i) { if(room
    [k-1]==1) { room[k-1]=0; }else { room[k-1]=1; } } for(j=0;j<n;j++) { if(room[j]
    ==0) { System.out.print(j+1+"、"); } } System.out.println("是開鎖的"); } } public
    void LawWarder(int n) { System.out.println("規律法"); System.out.println("牢房數為"+n+
    "時"); for(int i=1;i<+n;i++) { if(i*i<=n) { System.out.print(i*i+"、"); } } System
    .out.println("是開鎖的"); } public static void main(String[] args) { int n=10;//牢房間數
    Warder warder= new Warder(); warder.WarderResult(n); warder.LawWarder(n); } }
    <>4.結果
    暴力法 牢房數為10時 第1次通過牢房1、2、3、4、5、6、7、8、9、10、是開鎖的 第2次通過牢房1、3、5、7、9、是開鎖的 第3次通過牢房1、5、6
    、7、是開鎖的 第4次通過牢房1、4、5、6、7、8、是開鎖的 第5次通過牢房1、4、6、7、8、10、是開鎖的 第6次通過牢房1、4、7、8、10、是開鎖的
    第7次通過牢房1、4、8、10、是開鎖的 第8次通過牢房1、4、10、是開鎖的 第9次通過牢房1、4、9、10、是開鎖的 第10次通過牢房1、4、9、是開鎖的
    規律法 牢房數為10時 1、4、9、是開鎖的

    技術
    下載桌面版
    GitHub
    百度網盤(提取碼:draw)
    Gitee
    云服務器優惠
    阿里云優惠券
    騰訊云優惠券
    華為云優惠券
    站點信息
    問題反饋
    郵箱:ixiaoyang8@qq.com
    QQ群:766591547
    關注微信
    巨胸美乳无码人妻视频