雞尾酒買罐子

2021-09-05 12:17:59 字數 1231 閱讀 2713

雞尾酒喜歡罐子,有一天他到了乙個罐子專賣店,他決定買好多好多罐子回家。但是專賣店快關門了,雞尾酒必須盡快選購,他決定按順序把罐子瀏覽一遍,如果他的錢花完了(錢數=0)或者已經走過了最後乙個罐子,就會立即離開商店。

由於雞尾酒不會掩飾自己對罐子的喜愛,所以只要他現有的錢大於等於當前看到的罐子的**,他就會購買。

雞尾酒有n元錢,並且想買m個罐子,你能幫他算算他應該至少帶多少錢才能買到m個罐子嗎?

第一行包含三個整數n,m,k。
n代表雞尾酒最多能帶的錢(0<=n<10^9),m代表雞尾酒想買的罐子數量,k代表商店裡罐子的數量,

保證商店至少有m個罐子(1<=m<=k<=300)。

接下來一行包含k個整數,第i個數表示第i個罐子的**pi。(0<=pi<=1000)

輸出雞尾酒購買m個罐子至少需要帶的錢數。

如果雞尾酒無論如何都買不了m個罐子,輸出 "poor chicken tail wine!"

輸入

5 2 3

1 2 3

輸出輸入

1 2 2

100 100

輸出poor chicken tail wine!

由於購買策略是"當前錢夠就買",所以並不是帶的錢越多能買的罐子數量越多

比如 有3個罐子**分別為  10,1,1,。 你帶了10塊錢只能買1個,而9塊錢能買兩個,所以不能用二分法。

由於每個罐子的最大***罐子總數 的最大結果是3

e5;所以暴力列舉試一下。

題目有個坑是錢數=0就離開商店,罐子的價錢可以是0。  如果不考慮這就wa了。

比如輸入

10 2 2

1 0應該輸出2,而不是1。

#include#include #include#include using namespace std;

const int maxn=305;

int a[maxn];

int n,m,k;

bool check(int x)

if(x==0||num>=m) break;

}return num>=m;

}int main()

int len=min(k*1000,n);

int ans=-1;

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

}if(ans==-1)else

return 0;

}

L 雞尾酒買罐子 貪心列舉 假二分

n雖然1e9 但是k 300個罐子 買m個 a i 1000 列舉錢數3e5 k 3個罐子 7 4 2 n 10 二分的話 錢數增 個數不一定增 n 10 2 n 9 2 n 8 1 n 7 1 n 6 2 include using namespace std typedef long long ...

雞尾酒排序

氣泡排序是從陣列的一側到另一側為一輪,根據條件兩兩交換,例如關於氣泡排序中的一組資料3 2 5 4 6 1 8 9 7,優化的氣泡排序在經過六輪之後得到排好的陣列,而雞尾酒排序是一輪次比較兩回 先從左到右比較,如果左邊比右面大,交換位置 然後從右到左比較,左邊比右邊大,交換位置。就用冒泡中的那組數從...

雞尾酒排序

雞尾酒排序是一種定向的氣泡排序,也可以稱為攪拌排序 漣漪排序。是氣泡排序的一種變形。和氣泡排序的區別在於,雞尾酒排序採用了雙向比較並替換的原理。基本原理 第一步 宣告兩個臨時指標left和right,分別指向第乙個元素和最後乙個元素。第二步 每一輪比較時,從right往left方向查詢最大數,放到r...