雞尾酒喜歡罐子,有一天他到了乙個罐子專賣店,他決定買好多好多罐子回家。但是專賣店快關門了,雞尾酒必須盡快選購,他決定按順序把罐子瀏覽一遍,如果他的錢花完了(錢數=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...