CCF CSP 202012-2 期末预测之最佳阈值
202012-2 期末预测之最佳阈值
题目背景
考虑到安全指数是一个较大范围内的整数、小菜很可能搞不清楚自己是否真的安全,顿顿决定设置一个阈值 θ,以便将安全指数 y 转化为一个具体的预测结果——“会挂科”或“不会挂科”。
因为安全指数越高表明小菜同学挂科的可能性越低,所以当 y≥θ 时,顿顿会预测小菜这学期很安全、不会挂科;反之若 y<θ,顿顿就会劝诫小菜:“你期末要挂科了,勿谓言之不预也。”
那么这个阈值该如何设定呢?顿顿准备从过往中寻找答案。
题目描述
具体来说,顿顿评估了 m 位同学上学期的安全指数,其中第 i(1≤i≤m)位同学的安全指数为\(y_i\),是一个 \([0,10^8]\) 范围内的整数;同时,该同学上学期的挂科情况记作 \(result_i∈0,1\),其中 0 表示挂科、1 表示未挂科。
相应地,顿顿用 \(predict_θ(y)\) 表示根据阈值 θ 将安全指数 y 转化为的具体预测结果。
如果 $predict_θ(y_j) $与 \(result_j\) 相同,则说明阈值为 θ 时顿顿对第 j 位同学是否挂科预测正确;不同则说明预测错误。
\begin{array}{cc}
0& {(y < \theta)}
\\1& {(y \ge \theta)}
\end{array}
\right.
\]
最后,顿顿设计了如下公式来计算最佳阈值 θ∗:
\]
该公式亦可等价地表述为如下规则:
- 最佳阈值仅在 \(y_i\)中选取,即与某位同学的安全指数相同;
- 按照该阈值对这 m 位同学上学期的挂科情况进行预测,预测正确的次数最多(即准确率最高);
- 多个阈值均可以达到最高准确率时,选取其中最大的。
输入格式
从标准输入读入数据。
输入的第一行包含一个正整数 m。
接下来输入 m 行,其中第 i(1≤i≤m)行包括用空格分隔的两个整数\(y_i\)和 \(result_i\),含义如上文所述。
输出格式
输出到标准输出。
输出一个整数,表示最佳阈值 \(\theta^*\)。
样例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。
依规则三,\(\theta^*=max1,3=3\)。
样例2输入
8
5 1
5 0
5 0
2 1
3 0
4 0
100000000 1
1 0
样例2输出
100000000
子任务
70% 的测试数据保证 \(m≤200\);
全部的测试数据保证 \(2≤m≤10^5\)。
错误代码
#include<stdio.h>
int main(){
int m,i ,j,max,sum=0;
long int y[200],thta,sumi=0;
int r[200],p=0;
scanf("%d",&m);
while(i<m){
scanf("%ld %d",&y[i],&r[i]);
i++;
}
for (i=0;i<m;i++){
max=0;
thta=y[i];
for(j=0;j<m;j++){
if(y[j]<thta){
p=0;
}else{
p=1;
}
if(r[j]==p){
max ++;
}
}
if(max>sum||max==sum){
sum=max;
sumi=thta;
}
}
printf("%ld", sumi);
return 0;
}
参考思路1:前缀和
转载自:https://blog.csdn.net/qq_43464088/article/details/112080044
将时间复杂度从\(O(m^2)\)降到\(O(m)\);
解题思路:先对数据按照安全指数yi进行升序排序,然后求出比yi小的0的个数,比yi大的1的个数;
题目数据规模m为1e5,如果用暴力两层for循环是会超时的,只能通过70%的数据,不能拿满分;
前缀和
前缀和是一种重要的预处理,能大大降低查询的时间复杂度。
最简单的一道题就是给定 n 个数和 m 次询问,每次询问一段区间的和。求一个 O(n + m) 的做法。
用 O(n) 前缀和预处理,O(m) 询问。
for(int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + a[i]; //O(n)
while(m--) //O(m)
{
int L, R; scanf("%d%d", &L, &R);
printf("%d\n", sum[R] - sum[L - 1]);
}
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,Max=0,res;
int sum[N]={0};
set<int>st;
pair<int,int>pr[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int a,b;
cin>>a>>b;
pr[i]=make_pair(a,b);
}
sort(pr+1,pr+n+1);//1.先排序
for(int i=1;i<=n;i++)
sum[i] =sum[i-1]+ pr[i].second;//2.求挂科情况前缀和
for(int i=1;i<=n;i++)
{
int a=pr[i].first;//选取阈值
if(st.count(a)) continue;//set去重
st.insert(a);
int yuce1 = sum[n]-sum[i-1];//大于等于阈值时,应统计预测结果中为1的个数
int yuce0 = i-1-sum[i-1];//小与阈值时,应统计预测结果中为0的个数
int yuce = yuce1+ yuce0;//合计预测正确次数
if(yuce >= Max) {
Max=yuce;
res=a;
}
}
cout<<res;
return 0;
}
参考思路2
转载自:https://blog.csdn.net/qq_38632614/article/details/111934286
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct Node{
int theta;
int result;
}Node;
bool cmp(Node a,Node b){
return a.theta<b.theta;
}
int main(){
int m;
Node node[100005];
int flag0[100005]={0}; //记录小于每个位置点阈值的result=0的个数
int flag1[100005]={0}; //记录大于等于每个位置点阈值的result=1的个数
/*--输入--*/
cin>>m;
for(int i=0;i<m;i++){
cin>>node[i].theta>>node[i].result;
}
sort(node,node+m,cmp); //输入后排序
int i=0,j=1;
int temp0=0,temp1=0;
/*--统计小于每个阈值的result=0的个数--*/
while(j<m){
if(node[j].theta==node[i].theta){
j++;
continue;
}
int temp=0;
while(i<j){
if(node[i].result==0)temp++;
flag0[i]=temp0;
i++;
}
temp0+=temp;
}
while(i<j){
flag0[i]=temp0;
i++;
}
/*--以上统计小于每个阈值的result=0的个数--*/
/*--以下统计大于等于每个阈值的result=1的个数--*/
for(int i=0;i<m;i++){
if(node[m-1-i].result==1){
temp1++;
}
flag1[m-1-i]=temp1;
}
//根据flag0和flag1计算每个阈值的准确个数,输出最大的对应的阈值
int ans=0,num=0;
for(int i=0;i<m;i++){
if(flag0[i]+flag1[i]>=num){
num=flag0[i]+flag1[i];
ans=node[i].theta;
}
}
cout<<ans;
}
CCF CSP 202012-2 期末预测之最佳阈值的更多相关文章
- CCF CSP 202012-1 期末预测之安全指数
202012-1 期末预测之安全指数 题目背景 期末要到了,小菜同学找到了自己的好朋友顿顿,希望可以预测一下自己这学期是否会挂科. 题目描述 首先,顿顿选取了如"课堂表现".&qu ...
- CCF CSP 认证
参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...
- CCF CSP 201609-2 火车购票
题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...
- CCF CSP 201703-3 Markdown
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...
- CCF CSP 201703
CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...
- CCF CSP 201312-3 最大的矩形
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...
- CCF CSP 201609-3 炉石传说
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...
- CCF CSP 201403-3 命令行选项
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...
- CCF CSP 201709-4 通信网络
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...
随机推荐
- 基础设施层-Adnc.Infr.Consul
Adnc.Infr.Consul 主要提供服务自动注册/发现以及获取配置. 项目结构 Configuration 配置中心相关共功能,主要有两个关键类 1.ConsulConfigurationPro ...
- 机器学习之shape
shape[:2] 取彩色图片的长和宽 shape[:3]取彩色图片的长和宽和通道 img.shape[0]:图像的垂直高度 img.shape[1]:图像的水平宽度 img.shape[2]:图像的 ...
- Java8接口的默认方法
项目实战 实现上图接口的实现类有很多,其中有些实现类已经在生成环境了,现在需要新增几个实现类,都需要有回调方法,所以在接口中添加了一个回调的默认方法,如果使用接口的普通方法就得改所有实现了接口的实现类 ...
- NOIP初赛篇——10计算机网络
网络的定义 所谓计算机网络,就是利用通信线路和设备,把分布在不同地理位置上的多台计算机连接起来. 计算机网络是现代通信技术与计算机奇数结合的产物. 网络中计算机与计算机之间的通信依靠协议进 ...
- 【JS学习】数组过滤方法的使用filter
前言:本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 使用效果: 可以返回参数函数为真的值 //情景:实现从stu数 ...
- python函数2-函数参数
rgb法则:
- 【Spring】Spring中的Bean - 3、Bean的作用域
Bean的作用域 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 通过Spring容器创建一个Bean的实例时,不仅可以完成 ...
- 【Linux】添加硬盘不需要重启服务器
添加硬盘之后,不用重启服务器 执行下面的语句 ls /sys/class/scsi_host 查看下面有多少host 我这里有三个host 分别执行 echo "- - -" &g ...
- 【VNC】vnc远程连接的时候无法显示图像已解决
介绍一个 VNC连接工具:iis7服务器管理工具 IIs7服务器管理工具可以批量连接并管理VNC服务器 作为服务器集成管理器,它最优秀的功能就是批量管理windows与linux系统服务器.vps.能 ...
- three.js cannon.js物理引擎之约束
今天郭先生继续说cannon.js,主演内容就是点对点约束和2D坐标转3D坐标.仍然以一个案例为例,场景由一个地面.若干网格组成的约束体和一些拥有初速度的球体组成,如下图.线案例请点击博客原文. 下面 ...