CSP_202012-2_期末预测之最佳阈值

该代码实现了一个算法,通过前缀和和集合去重处理区间内0和1的个数,以找到最大预测正确次数的安全指数yi。首先对数据进行排序,然后计算挂科情况的前缀和,接着遍历区间,统计未挂科和挂科的预测次数,找到最大值。

问题描述

在这里插入图片描述

思路

使用前缀和的思路

[1,i-1]区间0的个数(预测0正确次数): i-1-sum[i-1]
[i,m]区间1的个数(预测1正确次数): sum[m] - sum[i-1]
yi	 resulti  sum[i]	[1,i-1]区间0的个数	[i,m]区间1的个数
0		0		0				0					4								
1		0		0		(重复的不考虑,会出错,用set.count去重)
1		1		1				1					4
3		1		2				2					3
5		1		3				2					2
7		1		4				2					1

完整代码

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+5;
int sum[N]={0};     //前缀和
set<int>st;         //实现去重
pair<int,int>pr[N]; //存储yi和resulti

int main()
{
	int m;
	cin >> m;
	for(int i = 1; i <= m; i++)
		cin >> pr[i].first >> pr[i].second;

	sort(pr+1, pr+m+1);//1.先排序

	for(int i = 1; i <= m; i++)
		sum[i] =sum[i-1]+ pr[i].second;//2.求挂科情况前缀和

    int yuce1, yuce0, yuce;     //分别统计未挂科、挂科、总的预测正确次数
    int Max = 0;    //最大预测正确次数
    int yi;        //对应的安全指数yi
    for( int i = 1; i <= m; i++)
    {
        int a = pr[i].first;
        if( st.count(a))
            continue;
        st.insert(a);

        yuce1 = sum[m] - sum[i-1];  //[i,m]区间内有多少个1
        yuce0 = i - 1 - sum[i-1];   //[1,i-1]区间有多少个0
        yuce = yuce1 + yuce0;

        if( yuce >= Max)
        {
            Max = yuce;
            yi = a;
        }
    }

    cout << yi;
	return 0;
}

提交截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值