牛牛锻炼题解
题解
1.每种项目增加一分的代价是不同的,牛牛想要增加到所有项目的平均分大于一个阈值d,这里先优化成需要总分为d*n,避免精度问题。然后考虑一分一分的增加,每次选择代价最小的进行增加,如果增加到目标分数就跳过换第二小的项目,这样写最坏情况时间下复杂度会去到O(n^2),不能通过此题。
利用贪心的思想去解这道题目,我们会发现对于任何项目而言,它的分数的贡献是等效的,于是我们只需要贪心地去选择最便宜地即可。
所以我们按照它的C值进行一次从小到大排序即可。值得注意的是,我们在计算一个项目的分数时应该一整段的计算而不是一分一分计算,那样会超时。
时间复杂度
空见复杂度
class Solution { public: /** * * @param n int整型 * @param d int整型 * @param a int整型vector * @param b int整型vector * @param c int整型vector * @return long长整型 */ struct Node{ long long x,y; bool friend operator < (Node a,Node b) { return a.y<b.y; } }e[100005]; long long solve(int n, int d, vector<int>& a, vector<int>& b, vector<int>& c) { // write code here long long cnt=0; long long sum=1ll*d*n; for (int i=0; i<n; i++) { cnt+=(long long )b[i]; e[i].x=a[i]-b[i]; e[i].y=c[i]; } if (cnt>=sum) { return 0; } sort(e,e+n); sum-=cnt; long long ans=0; for (int i=0; i<n; i++) { long long tmp=min(sum,e[i].x); ans+=e[i].y*tmp; sum-=tmp; if (sum==0) break; } return ans; } };