另类解法,求佬分析复杂度,AC代码有注释
查看原帖
另类解法,求佬分析复杂度,AC代码有注释
1110135
I_sland楼主2024/3/14 18:56

另类解法,求大佬分析复杂度,是AC代码且有注释,用set习惯了没有用优先队列```cpp

#include<bits/stdc++.h>
#define N 10050
typedef long long ll;
using namespace std;
ll fun(ll a,ll b,ll c,ll x){
	return a*x*x+b*x+c; //算函数值 
}
ll a[N],b[N],c[N];
set<ll>Num;//存放还可用来更新m个最小值的函数的序号 
set<pair<ll,ll>>S;//利用set优先排序第一项,用第一项存函数值,第二个项存该值出处 
int main(){
	ll n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		Num.insert(i);
		cin>>a[i]>>b[i]>>c[i];
	}
	for(int x=1;Num.size();x++){//如果还有函数能用来更新这m个最小值 
		for(auto p=Num.begin();p!=Num.end();p++){
			S.insert({fun(a[*p],b[*p],c[*p],x),*p});
		}
		while(S.size()>m){//维持最小的m个 
			auto q=S.end();
			q--;
			if(Num.find(q->second)!=Num.end()){
				Num.erase(q->second);//这个函数可以不用再遍历了,因为接下来用它取到的也只会比这个最大值还大 
			}
			S.erase(q);//删除最大的那个数 
		}
	}
	for(auto p=S.begin();p!=S.end();p++){
		cout<<p->first<<" ";
	}//答案 
	return 0;
}
2024/3/14 18:56
加载中...