性价比排序~

题目:处女座挑选了n道题开始刷,自己没有解决的题目每分钟都会给他带来bi的疲倦值,而解决每一道题目都需要花费ai分钟的时间。当然,处女座一般都是考虑清楚了再写题的,所以他在写题的时候都会精神抖擞,也就是说,当前正在写的那一题并不会给他带来任何疲劳。
找出最小所需要的疲倦值。
在这里插入图片描述
ps:(2≤N≤105).(2≤ai≤4*106).(1≤bi≤1000)
在这里插入图片描述

#include <stdio.h>
#include <algorithm>
using namespace std;
typedef struct ti
{
    long a;
    int b;
}ti;
ti arr[1000050];
bool cmp(ti A,ti B)
{
   return (A.a*1.0)/A.b<(B.a*1.0)/B.b ;    //性价比排序
} 
int main()
{
    long n;
    long long sum = 0;
    long long ans = 0;
    scanf("%d",&n);
    for(long i = 0;i < n;i++)
    {
        scanf("%d %d",&arr[i].a,&arr[i].b);
        sum += arr[i].b;
    }
    sort(arr,arr+n,cmp);
    for(long j = 0;j < n;j++)
    {
        sum -= arr[j].b;
        ans += sum * arr[j].a;
    }
    printf("%lld",ans);
    return 0;
}

思路:
我一开始的【错误思路】就是按照疲惫值由大到小排序,如果疲惫值一样,就按照做题时间由小到大排序。在依次计算求和即可。(但是当如果示例为 9/11 ; 10 /11 ; 2/8 的时候就发现按照比值排序的疲惫值更小)
但是这道题用的是【正确思路】性价比排序(比值?:用时间/疲惫值从大到小排序)……(类似于背包按单位体积价值排序??)

发布了60 篇原创文章 · 获赞 22 · 访问量 6992

猜你喜欢

转载自blog.csdn.net/weixin_43786143/article/details/86708056
今日推荐