笨小孩(贪心算法)

文章描述了一个关于优化学习顺序的问题,主角乐乐学习速度慢,但每完成一门课程,下门课程的学习时间会减少。给定每门课程的知识点数量和初始学习时间,目标是找出最佳的学习顺序以使总时间最短。提供的代码示例通过排序知识点数量并计算总时间来解决这个问题。
摘要由CSDN通过智能技术生成

题目描述:

乐乐是个笨小孩,学习知识点很慢,他现在要学习n门课程,每门课程有Ci个知识点,他学习每个知识点都需要花x个小时。
但是当他学完一门课程时,他的智商就会提高,学接下来那门课的每个知识点所花的时间,就会比上门课少一个小时。当然不可能无限制的减少,每个知识点至少需要1个小时。
小C要教乐乐这n门课,请你帮他安排一下顺序,能让乐乐尽快学完。

输入格式:

第一行两个整数n和x,表示总的科目数,和乐乐学每个知识点要花的时间。

第二行,n个数,表示每门课所包含的知识点数。

输出格式:

输出最少要花的时间。

样例输入:

样例1:
2 3
4 1

样例2:
4 2
5 1 2 1

样例输出:

样例1:
11

样例2:
10

提示:

样例1解释,先学习第二门课,所花的时间是3*1,学习完后,学习知识点的时间变为2,再学习第一门的时间是2*4,所以中的时间是11。
对于60%的数据,n的范围[1,1000];
对于100%的数据,n的范围[1,10^5],x的范围[1,1000],每门课的知识点个数范围[1,10^5];

时间限制: 1000ms
空间限制: 128MB

注意:本题需要用long long 类型,否则会出错。

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100001]={};
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    long long s=0;
    for(int i=0;i<n;i++){
    	s=s+a[i]*m;
    	m--;
    	if(m<=0) m=1;
	}
	cout<<s;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值