计算机软件能力认证考试系统http://118.190.20.162/view.page?gpid=T122
-
将时间复杂度从O(m2)O(m2)降到O(m)O(m);
-
解题思路:先对数据按照安全指数yi进行升序排序,然后求出比yi小的0的个数,比yi大的1的个数;
-
题目数据规模m为1e5,如果用暴力两层for循环是会超时的,只能通过70%的数据,不能拿满分;
前缀和:
二维:
一维:
int sum[N]={0}; //前缀和数组
int a[N]; //原数组
for (int i = 1; i <= m; i++) //求 前缀和
{
sum[i]=sum[i-1]+a[i];
}
解题如下代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
pair<int,int>student[N]; //相当于结构体
set<int> Y; //集合用于去重 安全指数有重复要去重
int sum[N]={0}; //前缀和数组
int Max=0;
int res;
int main()
{
int m;
cin>>m;
for(int i=1;i<=m;i++){
int a,b; cin>>a>>b;
student[i]=make_pair(a,b);
}
sort(student+1,student+m+1); // pair默认对first升序,当first相同时对second升序;
for (int i = 1; i <= m; i++) //求 前缀和
{
sum[i]=sum[i-1]+student[i].second;
}
for(int i=1;i<=m;i++)
{
int a=student[i].first;
if( Y.count(a)) continue; Y.insert(a);//集合去重 经典!!!!
int predict1=sum[m]-sum[i-1]; //大于等于阈值时 统计预测结果为1的
int predict0=i-1-sum[i-1]; //小于阈值时 统计预测结果为0的
int predict=predict0+predict1;
if(predict>=Max)
{
Max=predict;
res=a;
}
}
cout<<res;
// system("pause");
return 0;
}