列表

详情


NC21794. 鸡尾酒买罐子

描述

鸡尾酒喜欢罐子,有一天他到了一个罐子专卖店,他决定买好多好多罐子回家。但是专卖店快关门了,鸡尾酒必须尽快选购,他决定按顺序把罐子浏览一遍,如果他的钱花完了(钱数=0)或者已经走过了最后一个罐子,就会立即离开商店。

由于鸡尾酒不会掩饰自己对罐子的喜爱,所以只要他现有的钱大于等于当前看到的罐子的价格,他就会购买。

鸡尾酒有n元钱,并且想买m个罐子,你能帮他算算他应该至少带多少钱才能买到m个罐子吗?

输入描述

第一行包含三个整数n,m,k。
n代表鸡尾酒最多能带的钱(0<=n<109),m代表鸡尾酒想买的罐子数量,k代表商店里罐子的数量,
保证商店至少有m个罐子(1<=m<=k<=300)。
接下来一行包含k个整数,第i个数表示第i个罐子的价格pi。(0<=pi<=1000)

输出描述

输出鸡尾酒购买m个罐子至少需要带的钱数。

如果鸡尾酒无论如何都买不了m个罐子,输出 "poor chicken tail wine!"

示例1

输入:

5 2 3
1 2 3

输出:

3

示例2

输入:

1 2 2
100 100

输出:

poor chicken tail wine!

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 63ms, 内存消耗: 364K, 提交时间: 2020-07-03 13:51:20

#include <stdio.h>
int n, m, c, i, j, k, s, a[305];
int ok(int x){
	int i, j, k=0;
	for(i=1; x>0 && i<=n; i++){
		if(x >= a[i]) x -= a[i], k++;
	}
	return k >= c;
}
int main(){
	scanf("%d%d%d", &m, &c, &n);
	for(i=1; i<=n; i++){
		scanf("%d", &a[i]);
		s += a[i];
	}
	if(m > s+1) m = s + 1; 
	for(i=1; i<=m; i++){
		if(ok(i)) break;
	}
	if(i <= m) printf("%d\n", i);
	else printf("poor chicken tail wine!\n");
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 111ms, 内存消耗: 492K, 提交时间: 2018-12-23 17:23:04

#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[310],x,p;

int main(){
	scanf("%d %d %d",&n,&m,&k);
	for(int i=1;i<=k;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++){
		x=i;
		p=0;
		for(int j=1;j<=k;j++){
			if(x>=a[j]) x-=a[j],p++;
			if(x==0) break;
		}
		if(p>=m){
			cout<<i<<endl;
			return 0;
		}
	}
	cout<<"poor chicken tail wine!"<<endl;
	
	return 0;
}

上一题