內容
「唉時間過好快一下就要畢業了呢」溫泉旦說道。真的過的很快莫名其妙已經到了高三了,只剩下最後一次的NPSC可以參加,
溫泉旦不斷的寫題目練習,為了想要進決賽拿到一台筆電,這樣上大學就不用再買一台拉~聰明吧!
但是他發現除了要能夠寫出很多題目以外,還必須要練習寫題目的速度,因為比賽中會計算penalty (答對題數相同者,
以作答耗用時間較少者為優勝。) 看到了這一條溫泉旦就很疑惑,要怎麼樣寫才能讓penalty最低呢?
溫泉旦很電,他一看到題目就能知道每題分別需要寫多久,但由於同一時間只能寫一題,
因此他想找出最佳的解題順序使得penalty最小,其中penalty的計算方式為所有題目解題時間的總和。
舉例來說,若題目有3題,分別需要花1,2,3的時間,那麼如果他照著1,2,3的順序寫,
那麼他分別會在第1,3,6的時間完成該題,因此penalty為1+3+6=10,可以發現10同時也是這個情況下的最低penalty。
輸入說明
本題有多組測資,以EOF結束,測資組數不超過20組。
每筆測資第一行有一個正整數n代表該次練習的題目數量。
第二行有n個正整數ti分別代表每一題所需要的解題時間。
1≤n≤105 , 1≤ti≤104
輸出說明
對於每組測資輸出一個正整數,代表溫泉旦該次練習得到的penalty最低是多少。
範例輸入
3
1 2 3
3
2 2 2
1
10
範例輸出
10
12
10
程式
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
unsigned long long int n;
while(cin>>n){
unsigned long long int arr[n];
for(int i = 0; i < n; i++){
cin>>arr[i];
}
sort(arr, arr+n);
for(int j = 1; j < n; j++){
arr[j] += arr[j-1];
}
unsigned long long int x = 0;
for(int l = 0; l < n; l++){
x += arr[l];
}
cout<<x<<"\n";
}
return 0;
}
說明
從作答時間少的題目寫到作答時間長的,penalty會最小。
0 Comments
張貼留言