[CSP-J2020] 直播获奖

题目

添加链接描述
1
5

70分代码

#include <bits/stdc++.h>
using namespace std;
int n,
	x,
	p;
vector<int> v; 
void view(){
	cout<<"内容:\n";
	for(vector<int>::iterator i=v.begin();i!=v.end();i++)cout<<*i<<"\t";
	cout<<endl;
}
int main(){
	//freopen("data.cpp","r",stdin);
	cin>>n>>p;
	for(int i=1;i<=n;i++){
		cin>>x;v.push_back(x);
		sort(v.begin(),v.end(),greater<int>());
		//view();
		int m=floor(i*p*1.0/100)-1;
		if(m<0)m=0;
		cout<<v[m]<<" ";
	}
	return 0;
}

n个数,每次排序nlogn,超时

插入新数据,100分

#include <bits/stdc++.h>
using namespace std;
int n,
	x,
	p;
vector<int> v; 
void view(){
	cout<<"内容:\n";
	for(vector<int>::iterator i=v.begin();i!=v.end();i++)cout<<*i<<"\t";
	cout<<endl;
}
int main(){
	//freopen("data.cpp","r",stdin);
	cin>>n>>p;
	for(int i=1;i<=n;i++){
		cin>>x;
		vector<int>::iterator it=v.begin();
		if(!v.empty())
		while(x<*it&&it!=v.end()&&!v.empty())it++;
		v.insert(it,x); 
		//view();
		int m=floor(i*p*1.0/100)-1;
		if(m<0)m=0;
		cout<<v[m]<<" ";
	}
	return 0;
}

不用nlogn排序,直接插入O(n),循环n次就是n2。对于n=105,就是1010大于1秒108,还好侥幸通过。

最高600分,每次从高分往下统计分数线人数

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,//人数 
	x,//各成绩 
	p,//获奖比例 
	d[601];//各分数人数 
int main(){
	//freopen("data.cpp","r",stdin);
	cin>>n>>p;
	for(int i=1,maxx=0;i<=n;i++){//人数 
		cin>>x;d[x]++;
		maxx=max(maxx,x);//最高分数 
		int m=floor(i*p*1.0/100),//获奖人数 
			he=0,//从大到校统计获奖人数 
			j=maxx;
		if(m==0)m=1;//如果获奖人数是0就是1 
		//cout<<"各数"<<x<<"\t需要人数"<<m<<"\t"<<j<<endl;
		while(he<m&&j>=0){//人数不够就继续, 
			if(d[j]){//如果有人 
				he+=d[j];x=j;//该分数暂时是分数线。增加获奖人数 
			}
			j--;
		}
		cout<<x<<" ";
	}
	return 0;
}

每次统计600个人,常数,可以省略。
所以是O(n)

小结

要落实到数据中。
1*0.6=0.6=0,没有0个人的情况。要手动改成1.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值