项链(C++)
题目描述
小B想给她的新项链染色。
现在有m种颜色,对于第i种颜色,小B有
a
i
a_i
ai单位的颜料,每单位颜料可以染项链的一个珠子;
同时,小B对于第i种颜色的喜爱度为
b
i
b_i
bi。
已知项链有n个珠子,求染色后每个珠子的颜色的喜爱度之和的最大值。
(每个珠子只能至多被染一次,不被染色则喜爱度为0)
输入描述:
第一行两个数n,m
第二行m个数
a
i
a_i
ai
第三行m个数
b
i
b_i
bi
输出描述:
一个数表示答案
示例1
输入
5 3
1 2 3
3 2 1
输出
9
示例2
输入
5 3
1 2 1
3 2 1
输出
8
备注:
1
≤
n
,
m
≤
1
0
5
,
0
≤
a
i
,
b
i
≤
1
0
6
1≤n,m≤10^5,0≤ai,bi≤10^6
1≤n,m≤105,0≤ai,bi≤106
题目思路:
贪心算法,定义一个结构体,从喜爱度由大到小排序。
解题代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6+5;
struct st
{
int a;
int b;
}c[N];
bool cmp(st x, st y) { return x.b > y.b; }
int main()
{
int n,m,a[N],b[N],sum=0,Count=0;
cin >> n >> m;
for(int i=0;i<m;++i) cin >> c[i].a;
for(int i=0;i<m;++i) cin >> c[i].b;
sort(c,c+m,cmp);
for(int i=0;i<m;++i)
{
Count += c[i].a;//先全部加上
sum += c[i].a*c[i].b;
if( Count>=n )
{
sum -= (Count-n)*c[i].b;//减去多余的
break;
}
}
cout << sum << endl;
}