还能再优化吗?
查看原帖
还能再优化吗?
1045401
hard_shuati楼主2023/10/14 08:26
#include <bits/stdc++.h>
using namespace std;
int n,w,temp[602],pts,nownum;
int main(){
//	freopen("live.in","r",stdin);
//	freopen("live.out","w",stdout);
	cin>>n>>w;
	for(int i=1;i<=n;i++){
		cin>>pts;
		//已评出了i个选手的成绩
		//当前计划获奖人数为 max(1,p*w/100)其中 w 是获奖百分比
		//如有选手成绩相同,则所有成绩并列的选手都能获奖
		temp[pts]++;
		nownum=max(1,i*w/100);
		//如果枚举每个成绩,求分数线
		//那么总时间复杂度为Θ(600n)≈1e3*1e5≈1e8,有点危险。
		//目标时间复杂度是Θ(nlogn)或Θ(n)。
		//但是由于需要用到对顶堆或树状数组,所以我没有用,去优化代码了。
		int ans=0,j=600;
		for(;j>=0;j--){
			ans+=temp[j];
			if(ans>=nownum)break;
		}
		cout<<j<<" ";
	}
	return 0;
}

听说,此题正解是对顶堆。那能不能把计数排序算法进行常数优化,以达到最佳时间复杂度?

2023/10/14 08:26
加载中...