链接:https://ac.nowcoder.com/acm/contest/321/L
来源:牛客网
题目描述
鸡尾酒喜欢罐子,有一天他到了一个罐子专卖店,他决定买好多好多罐子回家。但是专卖店快关门了,鸡尾酒必须尽快选购,他决定按顺序把罐子浏览一遍,如果他的钱花完了(钱数=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
输出
3
输入
1 2 2
100 100
输出
poor chicken tail wine!
题解
由于购买策略是"当前钱够就买",所以并不是带的钱越多能买的罐子数量越多
比如 有3个罐子价格分别为 10,1,1,。 你带了10块钱只能买1个,而9块钱能买两个,所以不能用二分法。
由于每个罐子的最大价格*罐子总数 的最大结果是3e5;所以暴力枚举试一下。
题目有个坑是钱数=0就离开商店,罐子的价钱可以是0。 如果不考虑这就wa了。
比如输入
10 2 2
1 0
应该输出2,而不是1。
代码
#include<algorithm>
#include <iostream>
#include<cstring>
#include <cstdio>
using namespace std;
const int maxn=305;
int a[maxn];
int n,m,k;
bool check(int x){
int num=0;
for(int i=0;i<k;i++){
if(x>=a[i]){
num++;
x-=a[i];
}
if(x==0||num>=m) break;
}
return num>=m;
}
int main(){
cin>>n>>m>>k;
for(int i=0;i<k;i++){
scanf("%d",a+i);
}
int len=min(k*1000,n);
int ans=-1;
for(int i=1;i<=len;i++){
if(check(i)){
ans=i;
break;
}
}
if(ans==-1){
printf("poor chicken tail wine!\n");
}else{
printf("%d\n",ans);
}
return 0;
}