CSP 202012-2期末预测之最佳阈值

2023-10-14 20:33

本文主要是介绍CSP 202012-2期末预测之最佳阈值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述
试题编号: 202012-2
试题名称: 期末预测之最佳阈值
时间限制: 1.0s
内存限制: 512.0MB

题目背景

考虑到安全指数是一个较大范围内的整数、小菜很可能搞不清楚自己是否真的安全,顿顿决定设置一个阈值 θ,以便将安全指数 y 转化为一个具体的预测结果——“会挂科”或“不会挂科”。

因为安全指数越高表明小菜同学挂科的可能性越低,所以当 y≥θ 时,顿顿会预测小菜这学期很安全、不会挂科;反之若 y<θ,顿顿就会劝诫小菜:“你期末要挂科了,勿谓言之不预也。”

那么这个阈值该如何设定呢?顿顿准备从过往中寻找答案。

题目描述

具体来说,顿顿评估了 m 位同学上学期的安全指数,其中第 i(1≤i≤m)位同学的安全指数为 yi,是一个 [0,108] 范围内的整数;同时,该同学上学期的挂科情况记作 resulti∈0,1,其中 0 表示挂科、1 表示未挂科。

相应地,顿顿用 predictθ(y) 表示根据阈值 θ 将安全指数 y 转化为的具体预测结果。
如果 predictθ(yj) 与 resultj 相同,则说明阈值为 θ 时顿顿对第 j 位同学是否挂科预测正确;不同则说明预测错误。

predictθ(y)={0 (y<θ),1(y≥θ)}

最后,顿顿设计了如下公式来计算最佳阈值 θ∗:

θ∗=maxargmaxθ∈yi⁡∑j=1m(predictθ(yj)==resultj)

该公式亦可等价地表述为如下规则:

  1. 最佳阈值仅在 yi 中选取,即与某位同学的安全指数相同;

  2. 按照该阈值对这 m 位同学上学期的挂科情况进行预测,预测正确的次数最多(即准确率最高);

  3. 多个阈值均可以达到最高准确率时,选取其中最大的。

输入格式

从标准输入读入数据。

输入的第一行包含一个正整数 m。

接下来输入 m 行,其中第 i(1≤i≤m)行包括用空格分隔的两个整数 yi 和 resulti,含义如上文所述。

输出格式

输出到标准输出。

输出一个整数,表示最佳阈值 θ∗。
样例1输入

6
0 0
1 0
1 1
3 1
5 1
7 1

样例1输出

3

样例1解释

按照规则一,最佳阈值的选取范围为 0,1,3,5,7。

θ=0 时,预测正确次数为 4;

θ=1 时,预测正确次数为 5;

θ=3 时,预测正确次数为 5;

θ=5 时,预测正确次数为 4;

θ=7 时,预测正确次数为 3。

阈值选取为 1 或 3 时,预测准确率最高; 所以按照规则二,最佳阈值的选取范围缩小为 1,3。

依规则三,θ∗=max1,3=3。

样例2输入

   85 15 05 02 13 04 0100000000 11 0

样例2输出

100000000

子任务

在这里插入图片描述

思路

看直播课看到的方法是用前缀和,以判断数为基准画线,计算该线之前的0的个数与该线之后的1的个数,得到的就是该数判断正确的总个数;用pair存储的二元组,用s[2][N]分别存储0和1的前缀和,代码大大缩短了

更新的AC代码

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
#define x first
#define y second
typedef pair<int,int> PII;
PII p[N];
int s[2][N];//s[0][i]:代表第i个数前面有多少个0,s[1][i]:代表第i个数前面有多少个1 
int main(){scanf("%d",&n);for(int i = 1;i <= n;i++) scanf("%d%d",&p[i].x,&p[i].y);sort(p+1,p+n+1);//将二元组排序 for(int i = 0;i < 2;i++)for(int j = 1;j <= n;j++)s[i][j] = s[i][j-1] + (p[j].y==i);int maxn = -1 , ans;for(int i = 1;i <= n;i++){int tp = s[0][i-1] + s[1][n] - s[1][i-1];if(tp >= maxn) maxn = tp,ans = p[i].x;while(i+1<=n && p[i].x==p[i+1].x)	//会出现1 0,1 1这种情况,应该算除了该数之外的前缀和,而不能算紧邻的前缀和 i++;}printf("%d",ans);
}

好久没有更新博客了,这学期天梯赛后就一直在搞其他的事情,很久没有刷题了,马上又要CSP认证了,赶快用假期时间刷刷题
这是去年12月份CSP时候的第二题,当时被这道题卡住了,后三个测试点一直过不去,最后170收尾,需要用更好的方法去做才能不运行超时,后三个测试数据应该是因为数据多导致了超时,显然用O(n^2)的方法不可行
那么通过分析样例,是不是对于每一个阈值的正确判断个数,只需要看前一个(比它小一个)阈值的学生的result情况就可以,比它小的阈值只有result=0才是正确的,所以如果前一个阈值的学生有一个为0,该阈值的正确判断就在前一个阈值的正确判断个数的情况下+1,;为1的话,就-1

AC代码:

#include<bits/stdc++.h>
using namespace std; 
struct people{int y,result;
}pp[100005];
bool cmp(struct people pp1,struct people pp2){return pp1.y < pp2.y;
}
int main(){int m;cin >> m;for(int i = 0;i < m;i++){cin >> pp[i].y >> pp[i].result;}sort(pp,pp+m,cmp);int stdd = pp[0].y;int max = 0;for(int i = 0;i < m;i++){if(pp[i].y < stdd && pp[i].result == 0){max++;}else if(pp[i].y >= stdd && pp[i].result == 1){max++;}}int index = 0;int tp = max;for(int i = 1;i < m;i++){if(stdd == pp[i].y){continue;}stdd = pp[i].y;	//当前阈值int temp = i-1;	while(pp[temp].y == pp[i-1].y){//找前一个阈值if(pp[temp].result==0){tp++;}else{tp--;}temp--;}if(tp >= max){max = tp;index = pp[i].y;}}cout << index << endl;
}

这篇关于CSP 202012-2期末预测之最佳阈值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/212983

相关文章

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

Prometheus与Grafana在DevOps中的应用与最佳实践

Prometheus 与 Grafana 在 DevOps 中的应用与最佳实践 随着 DevOps 文化和实践的普及,监控和可视化工具已成为 DevOps 工具链中不可或缺的部分。Prometheus 和 Grafana 是其中最受欢迎的开源监控解决方案之一,它们的结合能够为系统和应用程序提供全面的监控、告警和可视化展示。本篇文章将详细探讨 Prometheus 和 Grafana 在 DevO

springboot整合swagger2之最佳实践

来源:https://blog.lqdev.cn/2018/07/21/springboot/chapter-ten/ Swagger是一款RESTful接口的文档在线自动生成、功能测试功能框架。 一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,加上swagger-ui,可以有很好的呈现。 SpringBoot集成 pom <!--swagge

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

CSP-J基础之cmath常见函数

文章目录 前言1. **`sin` 函数**2. **`cos` 函数**3. **`exp` 函数**4. **`log` 函数**5. **`fabs` 函数**6. **`pow` 函数**7. **`sqrt` 函数**8. **`ceil` 函数**9. **`floor` 函数** 总结 前言 在计算机科学与编程中,数学函数是解决各种计算问题的基础工具。C++标准

Tensorflow lstm实现的小说撰写预测

最近,在研究深度学习方面的知识,结合Tensorflow,完成了基于lstm的小说预测程序demo。 lstm是改进的RNN,具有长期记忆功能,相对于RNN,增加了多个门来控制输入与输出。原理方面的知识网上很多,在此,我只是将我短暂学习的tensorflow写一个预测小说的demo,如果有错误,还望大家指出。 1、将小说进行分词,去除空格,建立词汇表与id的字典,生成初始输入模型的x与y d

临床基础两手抓!这个12+神经网络模型太贪了,免疫治疗预测、通路重要性、基因重要性、通路交互作用性全部拿下!

生信碱移 IRnet介绍 用于预测病人免疫治疗反应类型的生物过程嵌入神经网络,提供通路、通路交互、基因重要性的多重可解释性评估。 临床实践中常常遇到许多复杂的问题,常见的两种是: 二分类或多分类:预测患者对治疗有无耐受(二分类)、判断患者的疾病分级(多分类); 连续数值的预测:预测癌症病人的风险、预测患者的白细胞数值水平; 尽管传统的机器学习提供了高效的建模预测与初步的特征重