D题–处女座的训练
处女座靠着自己的家教本领赚够了去比赛的钱,于是开启了疯狂训练。
在每个夜深人静第二天不收作业的夜晚,他都会开始刷题。 "今日又
是一个刷题的夜晚。"他挑选了n道题开始刷,而题太多,刷不掉,理
还乱(呜呜)、自己没有解决的题目每分钟都会给他带来bibi的疲倦
值,而解决每一道题目都需要花费aiai分钟的时间。 当然,处女座一
般都是考虑清楚了再写题的,所以他在写题的时候都会精神抖擞,也就
是说,当前正在写的那一题并不会给他带来任何疲劳。 为了迎接后天
要收的作业和明天要遇到的小姐姐,他想让今晚的刷题尽可能的轻松,
那请你帮他找出最小所需要的疲倦值吧。
输入描述
输入数据共包括n+1行,第一行包括一个n表示处女座今晚打算训练的题
的数量。 接下来n行,每行包括两个整数ai,biai,bi,分别表示处女座
刷掉本题要花费的时间和本题每分钟会带来的疲倦值。
输出描述
一行包括一个整数,表示处女座今晚训练会产生的最小疲倦值。
分析
这道题要求最小的疲倦值,我们可以假设一共有两道题,时间和疲倦值分别
为a1、b1,a2、b2;如果先做第一道题那么他的疲倦值是a1乘以b2,如果先
做第二道题,那么他的疲倦值为a2乘以b1,那么就要选择总疲倦值小的排在
前面,由结构体排序可知,确定返回时a1.b2<a2.b1为true,则排序规则为
按照总疲倦值从小到大排序,返回的题目排序方式为总疲倦值小的排序方式,
以此类推,当总题数为三道题是,三道题分别为a1,b1、a2,b2、a3,b3;
首先是找放在第一个位置的题,如何找?当然是看疲倦值的大小了,先做第一题
的话,疲倦值为a1(b2+b3),先做第二题的话,疲倦值为a2(b1+b3),先做第
三题的话,疲倦值为a3(b1+b2),比较谁的疲倦值最小,那么谁就放在第一位,
比如:a1(b2*b3)和a2(b1+b3)比较,那么只需要比较a1b2和a2b1的大小即可,
找到这个规律就会发现,每次只需要比较ai/bi的大小就可以了,比值越小,疲倦值就越小。
代码
#include<stdio.h>
#include<algorithm>
using namespace std;
struct pijuan{
int a,b;
}pi1,pi2;
bool mycmp(pijuan pi1,pijuan pi2){
if((pi1.b*pi2.a)>(pi2.b*pi1.a)) return true;
else return false;
}
int main(){
int n,i,sum=0;
long long int ans=0;
pijuan arr[100005];
scanf("%d",&n);
for(i=0;i<n;++i){
scanf("%d %d",&arr[i].a,&arr[i].b);
sum+=arr[i].b;
}
sort(arr,arr+n,mycmp);
for(i=0;i<n;++i){
sum-=arr[i].b;
ans+=sum*arr[i].a;
}
printf("%lld",ans);
return 0;
}