CCF-CSP202012-2 期末预测之阈值 前缀和解题

本文介绍了一种如何将计算机软件能力认证考试中的问题,通过使用前缀和技巧将时间复杂度从O(m²)降低到O(m),以解决大规模数据预测问题。通过实例讲解了如何利用排序和前缀和数组来高效统计特定条件下的计数,以达到快速解题并提高通过率。
摘要由CSDN通过智能技术生成

计算机软件能力认证考试系统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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值