【问题标题】:Reducing complexity of O(n^2) to at least O(n log n)将 O(n^2) 的复杂度降低到至少 O(n log n)
【发布时间】:2021-03-29 23:08:02
【问题描述】:

我想降低这个程序的复杂性,但我不知道怎么做。

程序:
你正在举办一个活动,你需要钱。每个参与的人都会将其工资的百分比用于活动,但每个人都必须提供相同的百分比。例如,如果您选择的百分比是 30%,而 P 只愿意付出 20%,那么 P 不会给予任何东西。如果你选择了 30%,而 P 愿意给 80%,那么 P 只会给 30%。

你想弄清楚你能赚到最多钱的百分比是多少。

输入是:

第一行:参与人数 (n)
下 n 行:第 i 个人的工资,第 i 个人愿意放弃的工资的最大百分比

输出:
第一行:您可以为该活动获得的最大金额。

例子:

输入:

4
100001 83.2
40001 20
90001 77.32
300001 1.88

输出:

146909.5464

程序选择了能带来最多钱的百分比是77.32,并写道你可以从这个百分比中得到的钱是(100001+90001)*77.32

#include <iostream>
#include <iomanip>

using namespace std;

int N,A[200000];
double P[200000],suma,maxsuma;

int main(){

ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

cin>>N;
for(int i=0;i<N;i++){
    cin>>A[i]>>P[i];
}
for(int i=0;i<N;i++){
    suma=0;
    for(int j=0;j<N;j++){
        if(P[j]>=P[i]){
            suma+=P[i]*A[j]/100.0;
        }
    }
    maxsuma=max(suma,maxsuma);
}

cout<<fixed<<setprecision(20)<<maxsuma;

}

【问题讨论】:

  • 到目前为止你尝试了什么?
  • @Dr.Watson 这是我唯一能想到的,但我在下面得到了答案。

标签: c++ algorithm time-complexity


【解决方案1】:

首先,将所有员工按他们愿意给出的百分比降序排列。现在无论你选择什么百分比,只有名单上的第一批人会真正付钱。因此,您将获得最大的利润,使其成为最后一个人的百分比。现在还要注意,从这个前缀每个人都给出salary * percentage,所以总付款是total salary * percentage。如果 s[i] 是直到第 i 个索引的所有人的总薪水,则 s[i] = s[i - 1] + a[i] 其中 a[i] 是第 i 个人的薪水。因此,您只需编写一个循环,首先使用上一次迭代中已知的s[i - 1] 计算s[i],然后将其乘以第 i 个人的百分比;在所有这些值中选择最高的。

我修改了你的代码来使用这个想法。

#include <iostream>
#include <iomanip>
#include <algorithm>

using namespace std;

int N;
std::pair<int, int> A[200000]
double maxsuma;

int main(){

ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

cin>>N;
for(int i=0;i<N;i++){
    cin>>A[i].second>>A[i].first;
}
std::sort(A, A + N, std::greater<std::pair<int, int>>());
int suma = 0;
for(int i=0;i<N;i++){
    suma += A[i].second;
    maxsuma=max(suma * A[i].first / 100.0, maxsuma);
}

cout<<fixed<<setprecision(20)<<maxsuma;

}

【讨论】:

  • 嘿,我有一个更一般的问题。我还有一些问题需要降低复杂性,所以我想知道你是否可以帮助我解决这些问题,因为你很快就找到了最后一个问题的答案。我在网上搜索资源,但找不到任何可以为我指明如何考虑降低算法复杂性的正确方向。
  • 根据时间复杂度优化程序的方法有很多,但没有单一的方法。我想最好的方法是在实践中掌握这些技巧。您可以尝试参加一些有竞争力的编程活动,例如,codeforces.com 定期举办比赛,当然还有其他的。
猜你喜欢
  • 2022-10-08
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
相关资源
最近更新 更多