算法笔试模拟题精解之“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;
}