1. 程式人生 > >(環形追及問題)A、B、C、D四隻螞蟻在一個正方形的操場上跑步,他們的速度分別為1圈/分鐘,1.5圈/分鐘,2圈/分鐘,2.5圈/分鐘。他們不帶起始位置和帶起始位置的解決。

(環形追及問題)A、B、C、D四隻螞蟻在一個正方形的操場上跑步,他們的速度分別為1圈/分鐘,1.5圈/分鐘,2圈/分鐘,2.5圈/分鐘。他們不帶起始位置和帶起始位置的解決。

求解:(1)十分鐘後螞蟻間兩兩相遇的次數。

            (2)九分鐘後螞蟻間兩兩相遇的次數。

            (3)若開始時A在起點,B在操場的1/4處,C在操場的1/2處,D在操場的3/4處,又如何?

首先我們來分析這個問題,環形追及相遇問題有一個預設的已知條件:

當快的追上慢的的時候經過的路程差(此處為路程差,手機上看到的路程是錯誤的)剛好為跑道一週的長度。

由此我們可以得到一個公式:

                    跑道一週的長度=速度差×追及時間

由題已知速度差和跑道長度可以根據公式計算得出追及時間

                    追及時間=跑道一週的長度÷速度差

因為每一次追上之後對於環形而言又是全新的開始所以:

                    相遇的次數=總時間÷追及時間

這道題(1)(2)問只需算出這些螞蟻兩兩之間的追及時間即可簡單得出結論。

因為剩下的步驟都是一些重複的計算所以可以考慮用程式碼完成

(1)(2)問程式碼實現如下

#python3
#定義一個螞蟻類,這個螞蟻類有名字屬性和速度屬性
class Ant(object):

    def __init__(self, name, speed):
        self.name = name
        self.speed = speed

#追及時間=跑道一週的長度÷速度差
def catch(ant1, ant2):
    #time為快的和慢的相遇一次的時間。
    time=0
    time = 1.0/abs(ant1.speed-ant2.speed)
    return time

#相遇的次數=總時間÷追及時間
#此題中次數為浮點數則為未完成,所以採用地板除。
def count_time(i, ant, temp, run_time, total_time):
    catch_time = catch(i, ant[temp])
    catch_num = run_time // catch_time
    total_time.append(catch_num)
    print("%s<-->%s:相遇一次的時間為%.2f分鐘,%s分鐘內相遇%s次" % (i.name, ant[temp].name, float(catch_time), run_time, catch_num))


def main():

    num = 0
    #記錄所有螞蟻之間兩兩相遇的次數。
    total_time = []

    #建立螞蟻A,讓螞蟻A以速度1圈/分跑起來
    A = Ant("螞蟻A", 1)

    # 建立螞蟻B,讓螞蟻B以速度1.5圈/分跑起來
    B = Ant("螞蟻B", 1.5)

    # 建立螞蟻C,讓螞蟻A以速度2圈/分跑起來
    C = Ant("螞蟻C", 2)

    # 建立螞蟻D,讓螞蟻D以速度2.5圈/分跑起來
    D = Ant("螞蟻D", 2.5)

    ant = [A, B, C, D]
    run_time = float(input("請輸入螞蟻跑步的時間:"))

    for i in ant:
        if i == A:
            for temp in range(1, 4):
                count_time(i, ant, temp, run_time, total_time)

        elif i == B:
            for temp in range(2, 4):
                count_time(i, ant, temp, run_time, total_time)

        elif i == C:
            for temp in range(3, 4):
                count_time(i, ant, temp, run_time, total_time)

    for i in total_time:

        num += i

    print("在%s分鐘後四隻螞蟻兩兩相遇的次數為:%s" % (run_time, num))

if __name__ == '__main__':
    main()

 在(3)中螞蟻們有了初始位置,我們可以先把從初始位置開始的他們第一次追上的時間算出來,餘下時間的相遇次數就和(1)(2)問的計算方法相同,只需在計算的次數上加一即可。

而第一次追上的時間one_catch_time根據已知可以得到

初始位置:loca

one_catch_time = (圈長 - 快的loca + 慢的loca) ÷ 速度差

程式碼如下:

#python3
#定義一個螞蟻類,這個螞蟻類有名字屬性速度屬性和初始位置屬性
class Ant(object):

    def __init__(self, name, speed, loca):
        self.name = name
        self.speed = speed
        self.loca = loca
#追及時間=跑道一週的長度÷速度差
def catch(ant1, ant2):
    #time為快的和慢的相遇一次的時間。
    time=0
    time = 1.0/abs(ant1.speed-ant2.speed)
    return time


#相遇的次數=總時間÷追及時間
#此題中次數為浮點數則為未完成,所以採用地板除。
def count_time(i, ant, temp, run_time, total_time):
    #計算第一次追上的時間
    one_catch_time = (1 - ant[temp].loca + i.loca) / abs(i.speed - ant[temp].speed)
    #第一次追上的時間得出後就可以從第一次追上之後作為起點開始計算,計算得出的次數加一即可。
    catch_time = catch(i, ant[temp])
    catch_num = (run_time-one_catch_time) // catch_time + 1
    total_time.append(catch_num)
    print("%s<-->%s:相遇一次的時間為%.2f分鐘,%s分鐘內相遇%s次" % (i.name, ant[temp].name, float(catch_time), run_time, catch_num))


def main():

    num = 0
    #記錄所有螞蟻之間兩兩相遇的次數。
    total_time = []

    #建立螞蟻A,讓螞蟻A以速度1圈/分跑起來
    A = Ant("螞蟻A", 1, 0)

    # 建立螞蟻B,讓螞蟻B以速度1.5圈/分跑起來
    B = Ant("螞蟻B", 1.5, 0.25)

    # 建立螞蟻C,讓螞蟻A以速度2圈/分跑起來
    C = Ant("螞蟻C", 2, 0.5)

    # 建立螞蟻D,讓螞蟻D以速度2.5圈/分跑起來
    D = Ant("螞蟻D", 2.5, 0.75)

    ant = [A, B, C, D]
    run_time = float(input("請輸入螞蟻跑步的時間:"))

    for i in ant:
        if i == A:
            for temp in range(1, 4):
                count_time(i, ant, temp, run_time, total_time)

        elif i == B:
            for temp in range(2, 4):
                count_time(i, ant, temp, run_time, total_time)

        elif i == C:
            for temp in range(3, 4):
                count_time(i, ant, temp, run_time, total_time)

    for i in total_time:

        num += i

    print("在%s分鐘後四隻螞蟻兩兩相遇的次數為:%s" % (run_time, num))

if __name__ == '__main__':
    main()

相關推薦

(環形問題)ABCD螞蟻一個正方形操場跑步他們速度分別1/分鐘1.5/分鐘2/分鐘2.5/分鐘他們起始位置起始位置解決

求解:(1)十分鐘後螞蟻間兩兩相遇的次數。             (2)九分鐘後螞蟻間兩兩相遇的次數。             (3)若開始時A在起點,B在操場的1/4處,C在操場的1/2處,D在操場的3/4處,又如何? 首先我們來分析這個問題,環形追及相遇問題有一個

Educational Codeforces Round 47 (Rated for Div. 2) A模擬 B思維 C數學 D數學暴力

A Code: #include <bits/stdc++.h> using namespace std; const int AX = 1e3 + 66; int a[AX]; int c

Tcp/Ip協議 ABCD類 地址

class 連接 以及 lan image 2.0 ren 2個 com TCP(傳輸控制協議):負責和遠程主機連接 Ip(網際協議):負責尋址,使報文發送到其該在的地方 Ip地址:是TCP/IP的網絡層用以標識網絡中主機的邏輯地址,可以唯一標識Interent中的一臺主

NETWORK筆記3:IP地址分類(ABCD類 E類)

IP地址分類(A類 B類 C類 D類 E類) IP地址由四段組成,每個欄位是一個位元組,8位,最大值是255,, IP地址由兩部分組成,即網路地址和主機地址。網路地址表示其屬於網際網路的哪一個網路,主機地址表示其屬於該網路中的哪一臺主機。二者是主從關係。 IP地址的四大型別標識的是網路中的某臺主機。

Codeforces Round #521 (Div. 3) A 模擬 B 貪心 C模擬 D 二分 E 二分+排序

A Code: #include <bits/stdc++.h> #define LL long long using namespace std; int main(){ int T ; cin >> T ; int a , b , k ;

Codeforces Round #521 (Div. 3) A 模擬 B 貪心 C模擬 D 二分 E 二分+排序

A Code: #include <bits/stdc++.h> #define LL long long using namespace std; int main(){ int T

ThinkPHP單字母函式整理 A函式 B函式 C函式 D函式 F函式 L函式 R函式 S函式 U函式

有人不太喜歡TP這種單字母函式,其實這也是TP的一個特色,如果理解了這些函式的作用,不管是背,還是寫,都是非常方便的,接下來我們以字母順序開始。   A函式(基本是Action的簡寫)   A函式是用來例項化我們的Action類的,例如我們的程式有2個Action分別是Inde

IP地址分類(ABCD類 E類)

 IP地址由四段組成,每個欄位是一個位元組,8位,最大值是255,,      IP地址由兩部分組成,即網路地址和主機地址。網路地址表示其屬於網際網路的哪一個網路,主機地址表示其屬於該網路中的哪一臺主機。二者是主從關係。   IP地址的四大型別標識的是網路中的某臺主機。I

Codeforces Round #511 (Div. 2) A 構造B 數學C素數篩

A 題意:構造a+b+c == n 且 a , b , c 都不為3的倍數。 思路:用1,2去構造即可。 Code: #include <bits/stdc++.h> using names

Codeforces Round #510 (Div. 2) A 模擬 B列舉 C D離散化+樹狀陣列(逆序對)

A Code: #include <bits/stdc++.h> #define LL long long #define INF 0x3f3f3f3f using namespace s

HTTP請求行中包含哪些內容?A請求方法 B資源名稱 C版本號 D狀態程式碼

答案:ABC解析:Http請求是指從客戶端到伺服器端的請求訊息。該請求訊息包括,在訊息首行中,對資源的請求方法、資源的識別符號及使用的協議。HTTP請求資訊由3部分組成:l 請求方法URI協議/版本l 請求頭(Request Header)l 請求正文HTTP響應HTTP應

Codeforces Round #524 (Div. 2) A 模擬 B數學 C 模擬 ,細節

A Code: #include <bits/stdc++.h> #define LL long long using namespace std; int main(){ int n ,

信用評分卡(A卡/B卡/C卡)的模型簡介開發流程|乾貨

如今在銀行、消費金融公司等各種貸款業務機構,普遍使用信用評分,對客戶實行打分制,以期對客戶有一個優質與否的評判。但是不是所有人都知道信用評分卡還分A,B,C卡三類! A卡(Application score card)申請評分卡 B卡(Behavior score car

lintcode 734. 形式a^i b^j c^k的子序列數量 題解

排列組合 lint 題解 else 時間復雜度 不同 con count cab 描述 給一字符串, 對形式為 a^i b^j c^k 的子序列進行計數, 即它由 i 個字符 a, 接著是 j 個字符 b, 然後是 k 個字符 c組成, i >= 1, j >

CF1066 A & B & C

A 題目連結CF1066 A Vova and Train 思路: 類似字首和暴力搞一下 code: #include <bits/stdc++.h> using namespace std; int T, L, V, l, r; template <typename T>

ES6中的高階函式:如同 a => b => c 一樣簡單

ES6來啦!隨著越來越多的程式碼庫和思潮引領者開始在他們的程式碼中使用ES6,以往被認為是“僅需瞭解”的ES6特性變成了必需的程式碼常識。這不僅僅是新的語法學習 - 在許多範例中, ES6中新的語言特性可以讓在ES5中寫起來非常麻煩的表達變得更加簡

*【CodeForces - 1088 ABC】套題比賽A水題B模擬C構造D互動

A. Input The only line contains the integer xx (1≤x≤100)(1≤x≤100). Output You should output two integers aa and 

Python中的 A for B in C 用法

一個例子 Y = [ [ int(x1+x2 < 1) ] for (x1, x2) in X ] 對X中的每一組元素(x1, x2)遍歷一遍,當滿足(x1+x2 < 1)時,就把這個布林值

天使輪,種子,A輪,B輪,C輪,Pre-IPO

         其實,每一個輪次與公司發展的階段緊密相關: 種子:沒有團隊,只有想法,1-2個創始人,要一筆錢。投資額100-300萬人民幣不等,幫助公司啟動。公司估值不會超過1500萬人民幣。 天使:團隊基本有了,大概3-

>A->B->C-

https://ac.nowcoder.com/acm/contest/322/D 題解:亂搞,有就行了 /* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream&