题目:处女座挑选了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 的时候就发现按照比值排序的疲惫值更小)
但是这道题用的是【正确思路】性价比排序(比值?:用时间/疲惫值从大到小排序)……(类似于背包按单位体积价值排序??)