牛客寒假算法基础训练营3

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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值