题目
添加链接描述
70分代码
cpp
#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分
cpp
#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分,每次从高分往下统计分数线人数
cpp
#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.