NOIP 模擬試題之 猴子摘桃

2021-09-02 22:46:29 字數 2048 閱讀 1900

【問題描述】

動物園內最受歡迎就是猴子了,因為它們除了能爬能跳外還會很多技能。其中a類猴子特別擅長爬樹摘桃,而b類猴子擅長把桃子掰成兩半。a類猴子有n只,編號為1到n,b類猴子有m只,編號為1到m。a類猴子中的第i只摘到第乙個桃子需要花費ai秒,此後每bi秒就能摘到桃子;b類猴子中的第i只掰開第乙個桃子需要花費ci秒,此後每di秒就能掰開乙個桃子。

不幸的是,b類猴子非常具有侵略性,兩種猴子不能同時待在場地內,因此,園長必須在a類猴子摘完所有桃子後立刻把它們帶走,然後立刻讓b類猴子進園;同樣當b類猴子把所有桃子全部掰開後也不能待在場地內太久,因為它們之間也會發生衝突,所有園長將在b類猴子掰開所有桃子後立刻送走它們。

園長帶走猴子和猴子進園的速度非常快,時間忽略不計。

alice非常喜歡看b類猴子掰桃子,告訴你表演的總時間,但不知道一共有多少個桃子,請你幫alice計算b類猴子進入動物園的時刻。

【輸入格式】

從檔案monkey.in中讀入資料。

輸入第一行包含乙個整數t(秒),表示猴子表演的總時間。接下來一行包含乙個整數n,表示a類猴子的數量。接下來n行,每行包含兩個整數ai和bi,描述a類每只猴子摘桃的速度。接下來一行包含乙個整數m,表示b類猴子的數量。接下來m行,每行包含兩個整數ci和di,描述b類每只猴子掰桃的速度。

【輸出格式】

輸出到檔案monkey.out中。

輸出兩類猴子進園的時刻相差多少秒。

【輸入樣例1】121

3 11

5 1【輸出樣例1】

5【樣例1說明】

樣例1中,樹上有3個桃子:

(1) a類猴子在3秒時摘下第乙個桃子,在4秒時摘下第二個桃子,在5秒時摘下第三個桃子;

(2) 在第5秒,園長把a類猴子帶走,此時b類猴子進園;

(3) b類猴子在10秒時掰開第乙個桃子,在11秒時掰開第二個桃子,在第12秒時掰開第三個桃子;

(4) 在12秒時園長進園帶走b類猴子。

【輸入樣例2】202

3 21 3

33 1

4 15 1

【輸出樣例2】

13【資料規模與約定】

對於 60%的資料, 1<=t<=1000,1<=ak,bk,ck,dk<=1000

對於100%的資料, 1<=t<=1000000000,1<=n,m<=100,1<=ak,bk,ck,dk<=1000000000

顯然就是二分,但是當時不知道怎麼腦子一卡就。。。就。。。打了個二分套二分。。。。。

然後我就wa了兩個點qaqaqaqaq

時間這麼大顯然可以直接二分最後的時間(就是a猴子吃桃子用的時間mid),二分出乙個時間之後算a猴子吃的桃子數量n1和b猴子吃的桃子數量n2,如果發現n1>n2說明a用的時間多了,應該往小的猜。否則往大的猜,同時記錄為乙個答案。

為什麼是「>」而不是「>=」呢?我們二分a猴子用的時間,那麼我們算出來的n1肯定是a猴子充分利用了這mid的時間恰好可以摘下這麼多個桃子。而b猴子在剩下的時間裡面不一定會恰好掰n2個桃子,因為一部分b猴子可能出現無桃子可掰的情況,但是它們必須要用最後的一秒來掰完桃子。所以說n1<=n2的時候有可能是a猴子用的時間少了,也有可能是時間恰好,這時候已經可能是乙個解了。

ac**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const int maxn=105;

int n,m,t;

struct dataa[maxn],b[maxn];

void _scanf(int &x)

void data_in()

_scanf(m);

for(int i=1;i<=m;i++)

}bool check(int mid)

void work()

printf("%d\n",ans);

}int main()

原文:

63猴子摘桃

程式設計訓練63猴子摘桃 問題描述 五隻猴子一起摘了一堆桃子,因為太累,五隻猴子決定先睡一覺再分。不久,其中乙隻猴子醒來了,它見別的猴子沒有醒來,便將一堆桃子平均分成 5 份,結果多了乙個,就將多的這個吃了,拿走其中的乙份並離開。又不久,第二隻猴 子醒來了,它不知道有乙個同伴已經拿走過桃子,便又將剩...

005猴子摘桃

猴子吃桃問題 猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了乙個。第二天早上又將第一天剩下的桃子吃掉一半,又多吃乙個。以後每天早上都吃了前一天剩下的一半零乙個。到第十天早上想再吃時,發現只剩下乙個桃子了。編寫程式求猴子第一天共摘了多少個桃子。include intmain void re...

(C語言)猴子摘桃

題目 乙個猴子摘了些桃子,第一天吃掉其中的一半然後多吃了1個,第二天照此方法又吃掉了剩下桃子的一半加1個,以後每天如此,直到第十天早上,猴子發現只剩下了1個桃子,請問猴子第一天總共摘了多少個桃子?輸出 a,b,c,d sum 分別表示 第九天早上沒有吃桃子之前桃子數,第八天早上沒有吃桃子之前桃子數,...