算法笔试模拟题精解之“Tom 爱吃巧克力”

算法笔试模拟题精解之“Tom 爱吃巧克力”

本人C++菜鸟一枚,题目可以做出结果,但是相信各位大佬们会有更好的解法,如果有错误,欢迎在评论区指出,一起学习

**题目:**Tom 非常喜欢巧克力,他上次买的巧克力吃完了,所以他打算再去买k 块巧克
力回来(1<=k<=1e5),他又是一个非常节俭的一个人,所以他想花最少的钱去买巧
克力。
现在有n 家卖巧克力的店(1<=n<=1e5),每个店的巧克力都限购bi 块( 最多只
能买bi 块,1<=bi<=1e5),每块的价格是ai(1<=ai<=1e9),请问Tom 买k 块巧克
力最少要花多少钱?题目保证n 个bi 的总和大于等于k。
输入卖巧克力的店的个数n(1<=n<=1e5); 打算去买的巧克力块数
k(1<=k<=1e5);和一个数组m, 其中mi =ai, bi 表示第i 家巧克力店的巧克力的价格
和限购块数
输出一个数,表示Tom 买k 块巧克力花的最少钱数

这道题目比较重要的是对二维数组的某一列进行排序
直接上C++代码

#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;

#define M 2
#define N 2

int main()
{
	int k=5 ;
	int result=0;
	int a[N][M]={{4,5},{2,4}};
	for(int i=0;i<N-1;i++)
	{
		for(int j=i+1;j<N;j++)
		{
			if(a[i][0]>a[j][0])
				swap(a[i],a[j]);

		}
	}

		while(k>0)
		{
			for(int i=0;i<N;i++)
			{
		       if(a[i][1]<k)
		       {
			      result = a[i][0]*a[i][1]+result;
			      k=k-a[i][1];
		       }
		      else
			  {
			      result = k*a[i][0]+result;
				  k=0;
				  
			   }
			 }
		}
	
	cout<<result<<endl;

	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值