鏈接:https://ac.nowcoder.com/acm/contest/329/D
來源:牛客網
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
處女座靠着自己的家教本領賺夠了去比賽的錢,於是開啓了瘋狂訓練。在每個夜深人靜第二天不收作業的夜晚,他都會開始刷題。
"今日又是一個刷題的夜晚。"他挑選了n道題開始刷,而題太多,刷不掉,理還亂(嗚嗚)、自己沒有解決的題目每分鐘都會給他帶來[Math Processing Error]bi的疲倦值,而解決每一道題目都需要花費[Math Processing Error]ai分鐘的時間。
當然,處女座一般都是考慮清楚了再寫題的,所以他在寫題的時候都會精神抖擻,也就是說,當前正在寫的那一題並不會給他帶來任何疲勞。
爲了迎接後天要收的作業和明天要遇到的小姐姐,他想讓今晚的刷題儘可能的輕鬆,那請你幫他找出最小所需要的疲倦值吧。
輸入描述:
輸入數據共包括n+1行,第一行包括一個n表示處女座今晚打算訓練的題的數量。
接下來n行,每行包括兩個整數[Math Processing Error]ai,bi,分別表示處女座刷掉本題要花費的時間和本題每分鐘會帶來的疲倦值。
輸出描述:
一行包括一個整數,表示處女座今晚訓練會產生的最小疲倦值。
示例1
輸入
複製
6
6 1
4 5
4 3
6 2
8 1
2 6
輸出
複製
86
說明
先做第6個題,增加(1+5+3+2+1)*2= 24 點疲倦值,再做第2個題,增加28點疲倦值,隨後依次是第3,4,1,5道題,增加16,12,6點疲倦值。總共的疲倦值是24 + 28 + 16 + 12 + 6 = 86點。
備註:
[Math Processing Error]2≤N≤105.
[Math Processing Error]2≤ai≤4⋅106.
[Math Processing Error]
思路:看樣例就知道先找出花費時間少的第一優先,疲憊值大的第二優先,排序就行
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
node [] a=new node[200005];
Long sum=(long) 0;
for(int i=1;i<=n;i++){
a[i]=new node();
a[i].x=sc.nextInt();
a[i].y=sc.nextInt();
sum+=a[i].y;
}
Arrays.sort(a,1,n+1,new My());
Long ans=(long) 0;
for(int i=1;i<=n;i++){
sum-=a[i].y;
ans+=(sum)*a[i].x;
}
System.out.println(ans);
}
}
class My implements Comparator<node>{
public int compare(node stu1, node stu2) {
return stu2.y*stu1.x-stu1.y*stu2.x;
}
}
class node{
public int x,y;
}