题目描述
最近小G新开了一家蛋糕店。开业第一天,一共来个n位顾客。由于小G非常懒,他每次只会接待一位顾客。每个顾客都想尽快的买到蛋糕,所以没有第一个买到蛋糕的顾客都会有一个愤怒值。最终排在第i个位置的顾客x的愤怒值为i*a[x]。小G想要所有顾客的愤怒值之和最小。求最小的愤怒值之和。
输入
第一行为一个整数n,表示顾客数。
第二行输入n个整数a[1]…a[n] ,含义见题面
输出
一行一个整数ans,表示最小的愤怒值之和。
输入样例
5
8 5 8 4 6
输出样例
51
说明
【样例解释】
Ans=8 * 1+6 * 2+5 * 3+4 * 4=51
【数据规模和约定】
对于30%的数据,1 ≤ n ≤ 10。
对于60%的数据,1 ≤ n ≤ 1000。
对于100%的数据,1 ≤ n ≤ 1000000。
解题思路
这道题其实就是排一下序,然后乘一下位数即可
注意
这道题看似很简单,但要用快读,比赛就是因为这样才少了90分!好伤心伤心
程序如下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
long long r,a[1000001],ans,t;
long long read()
{
int x=0;
char c=getchar();
while(c<'0'||c>'9')
{
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x;
}//快读
int main()
{
scanf("%d",&n);
for(long long i=1;i<=n;i++)
{
a[i]=read();//读入
}
sort(a+1,a+n+1);//排序
for(long long i=n-1,j=1;i>0;i--,j++)
{
ans=ans+a[i]*j;//计算
}
printf("%lld",ans);
return 0;
}
小G的蛋糕店开业,每位顾客的愤怒值与等待位置成正比。求最小化所有顾客愤怒值之和的策略。问题转化为对顾客需求进行排序。解题关键在于快速排序并计算总和。
895

被折叠的 条评论
为什么被折叠?



