鸡尾酒买罐子

链接: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;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值