CCF期末预测之最 佳阈值

本文探讨了一种高效算法,通过前缀后缀计数法寻找在给定序列中,预测学生考试结果的最佳阈值,以达到最高正确率。两种C++实现方式对比,暴力求解与巧妙优化的效率和复杂度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最佳居然发不出来

题目背景

在这里插入图片描述

题目描述

在这里插入图片描述

输入格式

在这里插入图片描述

输出格式

在这里插入图片描述

样例

输入

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

输出

3

C++解答

我自己想的当然还是暴力求解,把所有y都当成阈值遍历一遍,找到最大正确率的阈值,不知道为啥只得了50分

#include<iostream>
using namespace std;
int main()
{
    int n;
    int a=0;
    int max_num=0,max_a=0;
    cin>>n;
    int y[n];
    int result[n];
    for(int i=0;i<n;i++){
        cin>>y[i]>>result[i];
    }
    for(int i=0;i<n;i++){
        a=y[i];
        int num=0;
        for(int j=0;j<n;j++){
            int result_predict;
            if(y[j]<a) result_predict=0;
            else result_predict=1;
            if(result_predict==result[j]) num++;
        }
        if(num>=max_num) {
            max_num=num;
            max_a=a;
        }
    }
    cout<<max_a;
    return 0;
}

发现了一个前缀后缀的巧妙方法
先把阈值进行排序,通过计算每个值在序列中前面为0,后面为1的个数(真实),对于一个阈值来说自己预测的肯定是前面都为0后面都为1,因此真实的个数和最多的就是最佳阈值

#include<iostream>
#include<algorithm>
using namespace std;
pair<int,int> pii[100005];      //pair数组储存信息,每个pair存储一个同学的y和result
int pre0[100005];               //记录该位置及前面的result为0的个数(前缀和)
int rear1[100005];              //记录该位置及后面的result为1的个数(后缀和)
int k = -1,ma = 0;              //k用来记录最佳阈值,ma用来存储最佳阈值对应的预测成国公数目
int main(){
    int m;
    cin>>m;                     //输入m
    pii[0] = pair<int,int>(-1,-1);
    for(int i = 1;i <= m;++i)   //初始化pii数组
        cin>>pii[i].first>>pii[i].second;
    sort(pii + 1,pii + 1 + m);  //将所有学生信息按照阈值从小到大排序,方便后续前缀后缀和的操作
    for(int i = 1;i <= m;++i)            //记录前缀0个数
        if(pii[i].second == 0)
            pre0[i] = pre0[i - 1] + 1;
        else
            pre0[i] = pre0[i - 1];
    for(int i = m;i >= 1;--i)           //记录后缀1个数
        if(pii[i].second == 1)
            rear1[i] = rear1[i + 1] + 1;
        else
            rear1[i] = rear1[i + 1];
    for(int i = 1;i <= m;++i){          //最终处理
        if(pii[i].first == pii[i - 1].first)
            continue;                   //如果有阈值相同的情况,那么在相同区间的第一个位置统计了,直接跳过
        if(ma <= pre0[i - 1] + rear1[i])//更新k和ma
            ma = pre0[i - 1] + rear1[i],k = pii[i].first;
    }
    cout<<k;
    return 0;
}

<think>好的,我现在需要回答用户关于CCF CSP基础内容的问题。首先,我得回顾一下用户提供的引用资料,确保信息准确。用户提到了三个引用,其中引用[1]和[2]是关于考试介绍和备考策略的,引用[3]则涉及具体的知识点如vector和unordered_set的使用。 首先,我应该明确CCF CSP考试的基本信息,比如考试形式、题型和评标准。根据引用[1]和[2],考试为5道编程题,主要考察算法和编程能力,使用C++、Java或Python,且每题得独立。这部需要清晰呈现,让用户对考试结构有整体认识。 接下来是核心知识点,引用[3]提到了数据结构如vector和unordered_set的使用,这属于STL库的内容。我需要将这些知识点点列出,并简要说明每个部的重要性。例如,vector的动态数组特性、二维数组的应用,以及unordered_set的哈希表实现和常见操作。 然后,备考建议部需要结合引用[2]的三个月冲刺计划,强调基础巩固、真题训练和时间管理。这里要给出具体的学习步骤,比如阶段复习和每日刷题安排,帮助用户制定合理的学习计划。 在生成相关问题环节,要确保问题覆盖用户可能关心的方面,如考试难度、编程语言选择、常见错误和评标准。这些问题应该引导用户进一步探索,同时也能检验他们对已有信息的理解。 需要注意的是,回答中要自然地插入引用标识,如[^1]和[^2],尤其是在提到考试结构和备考策略时。同时,保持语言简洁,结构清晰,避免使用过多技术术语,让不同基础的用户都能理解。 后,检查是否符合系统级指令:行内公式是否正确使用$符号,独立公式是否用$$(虽然这里可能用不上),中文回答,问题生成是否相关,引用标识是否正确添加。确保所有引用来源准确对应,没有遗漏或错误。 总结起来,我需要组织信息为以下几个部:考试概述、核心知识点、备考建议和相关问题,每个部结合引用内容,确保回答的准确性和实用性。</think>### CCF CSP基础知识介绍 #### 一、考试概述 CCF CSP认证考试是中国计算机学会组织的编程能力认证,重点考察**算法设计与实现能力**。考试形式为**5道编程题**,限时5小时,支持C++、Java、Python三种语言,每题得独立(0-100),按总评定等级[^1]。 #### 二、核心知识点 1. **数据结构** - **`vector`动态数组**:初始化方式如$vector<int> arr(10,0)$,支持动态扩容,常用于替代传统数组[^3] - **二维数组处理**:通过嵌套vector实现,例如$vector<vector<int>> matrix(m, vector<int>(n))$ - **无序集合`unordered_set`**:基于哈希表实现,支持$O(1)$时间复杂度的查找,接口包含`insert()`、`find()`、`erase()` 2. **算法能力** - 排序算法(快速排序、归并排序) - 搜索算法(DFS、BFS) - 动态规划(背包问题、长子序列) - 图论算法短路径、小生成树) 3. **输入输出处理** ```python # Python示例:多组输入读取 import sys for line in sys.stdin: n = int(line.strip()) data = list(map(int, sys.stdin.readline().split())) ``` #### 三、备考建议 1. **基础巩固**(第1个月) - 熟练掌握至少一种编程语言的STL库(推荐C++的STL或Python的collections) - 每日完成3-5道基础算法题(如LeetCode简单难度) 2. **真题训练**(第2-3个月) - 重点研究**历年真题**(2014-2024年) - 建立错题本,析时间/空间复杂度优化方法 3. **时间管理** ```text | 题目难度 | 建议耗时 | |----------|----------| | 第1题 | ≤30钟 | | 第2题 | ≤45钟 | | 第3题 | ≤60钟 | | 第4-5题 | ≤90钟 | ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值