第十九次CCF计算机软件能力认证题目解析(详细题解+代码+个人解读+持续跟新)

news2024/12/26 10:44:23

第一题 线性分类器

考虑一个简单的二分类问题——将二维平面上的点分为 A A A B B B 两类。

训练数据包含 n n n 个点,其中第 i i i 个点( 1 ≤ i ≤ n 1 ≤i ≤ n 1in)可以表示为一个三元组 ( x i , y i , t y p e i ) (x_i,y_i,type_i) (xi,yi,typei),即该点的横坐标、纵坐标和类别。

在二维平面上,任意一条直线可以表示为 θ 0 + θ 1 x + θ 2 y = 0 \theta_0 + \theta_1x + \theta_2y = 0 θ0+θ1x+θ2y=0 的形式,即由 θ 0 、 θ 1 \theta_0、\theta_1 θ0θ1 θ 2 \theta_2 θ2 三个参数确定该直线,且满足 θ 1 、 θ 2 \theta_1、\theta_2 θ1θ2 不同时为 0 0 0

基于这 n n n 个已知类别的点,我们想要在平面上找到一条直线作为一个线性分类器。

具体来说,这条线要把训练数据中的 A 、 B A、B AB 两类点完美分隔开来,即一侧只有 A A A 类点、另一侧只有 B B B 类点。

这样,对于任意一个的未知类别的点,我们就可以根据它是位于直线的哪一侧来预测它的类别了。

在本题中我们仅需要处理 m m m 个如下查询:

给定一条直线,判断它是否能将训练数据中的 A 、 B A、B AB 两类点完美分开。

输入格式

输入共 n + m + 1 n+m+1 n+m+1 行。

第一行包含用空格分隔的两个正整数 n n n m m m,分别表示点和查询的个数。

第二行到第 n + 1 n+1 n+1 行依次输入 n n n 个点的信息。第 i + 1 i+1 i+1 行( 1 ≤ i ≤ n 1 \le i \le n 1in)包含用空格分隔的三项 x i 、 y i x_i、y_i xiyi t y p e i type_i typei,分别表示第 i i i 个点的横、纵坐标和类别,其中坐标为整数、类别为一个大写英文字母 A A A B B B

n + 2 n+2 n+2 行到第 n + m + 1 n+m+1 n+m+1 行依次输入 m m m 个查询。第 j + n + 1 j+n+1 j+n+1 行( 1 ≤ j ≤ m 1 \le j \le m 1jm)包含用空格分隔的三个整数 θ 0 、 θ 1 \theta_0、\theta_1 θ0θ1 θ 2 \theta_2 θ2,表示第 j j j 个查询中给定直线的三个参数。

输出格式

输出共 m m m 行,每行输出一个字符串。

j j j 行( 1 ≤ j ≤ m 1 \le j \le m 1jm)输出的字符串对应第 j j j 个查询的结果:如果给定直线可以完美分隔 A 、 B A、B AB 两类点,则输出 Yes,否则输出 No

数据范围

输入数据保证不存在恰好落在给定直线上的点;
0 < n ≤ 1 0 3 、 0 < m ≤ 20 0 < n \le 10^3、0 < m ≤ 20 0<n1030<m20,且 A 、 B A、B AB 两类点的数量均不为 0 0 0;
所有点的坐标和给定直线的三个参数均为整数,且绝对值 ≤ 1 0 6 ≤10^6 106;
任意两个点的坐标不完全相同。

QQ截图20210225130038.png

输入样例:
9 3
1 1 A
1 0 A
1 -1 A
2 2 B
2 3 B
0 1 A
3 1 B
1 3 B
2 0 A
0 2 -3
-3 0 2
-3 1 1
输出样例:
No
No
Yes
样例解释

只有第 3 3 3 个查询给出的直线能将 A 、 B A、B AB 两类点完美分隔。

QQ截图20210225130354.png
题目我的思路很简单,对于一个直线 L,一个点node, 考虑这个node在这个直线的相对位置,都在点的一侧的就是一类的点(就是把点延x,y轴向直线做投影,看投影的点与node的相对位置,判断左右和上下来区分,两侧的点的相对大小是不同的)

比如说一个点(x,y) , 和一条线(a + bx + cy = 0)那么有投影
(x , (a+bx)/-c) , ( (a+cy)/-b,y) 存在于线上 。 判断(a+bx)/-c 与 y 以及 (a+cy)/-b与x的大小就可以得到 点在线的上方还是下方,左边还是右边。(上图中(2,0)和(2,2)对于红线来说,(2,0)两个投影比较都为小于,而(2,2两个比较都为大于),则两个点应该不同类)
满分代码如下

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

int main (){
    long long n,m;
    cin>>n>>m;
    
    LL h[n+1][2];char s[n+1];
    
    for(int i = 1 ; i <= n ; i++){
        cin>>h[i][0]>>h[i][1]>>s[i];
    }
    
    LL linear[m+1][3]; char c = s[1];
    
    for(int i = 1;i<= m ; i++){
        cin>>linear[i][0]>>linear[i][1]>>linear[i][2];
        LL temp[2]; bool flag = true;
        if(linear[i][2] == 0) {
            temp[1] = 0;
        }else{
            temp[1] = int(-1.0 * (linear[i][0] +linear[i][1] * h[1][0]) / linear[i][2] > h[1][1]) == 0 ? -1 : 1;
        }
        if(linear[i][1] == 0) {
            temp[0] = 0;
        }else{
            temp[0] = int(-1.0 * (linear[i][0] +linear[i][2] * h[1][1]) / linear[i][1] > h[1][0]) == 0 ? -1 : 1;
        }
        for(int j = 2 ; j<= n && flag ; j++){
                LL a = 0, b=0;
                if(linear[i][2] == 0) {
                    b = 0;
                }else{
                    b = int(-1.0 * (linear[i][0] +linear[i][1] * h[j][0]) / linear[i][2] > h[j][1]) == 0 ? -1 : 1;
                }
                if(linear[i][1] == 0) {
                    a = 0;
                }else{
                    a = int(-1.0 * (linear[i][0] +linear[i][2] * h[j][1]) / linear[i][1] > h[j][0]) == 0 ? -1 : 1;
                    //cout<<-1.0 * (linear[i][0] +linear[i][2] * h[j][1]) / linear[i][1]<<'\n';
                }
                flag = ((((a==temp[0])+ (temp[1] == b)) == 2) ==(c==s[j]));
                //cout<<temp[0]<<temp[1]<<j<<a<<b<<' '<<c<<s[j]<<'\n'<<((a+b )== (temp[0] + temp[1]))<<' '<<(c==s[j])<<'\n';
        }
        if(flag) cout<<"Yes\n";
        else cout<<"No\n";
    }
    return 0;
}

我在做的时候犯了很多错:比如说忘了把1改为1.0 ,没有考虑到浮点数, 忘了加LL , 没有考虑到int爆炸,代码也写得很冗长。

第二题 稀疏向量

对于一个 n n n 维整数向量 v ∈ Z n v \in \mathbb{Z}^n vZn,其在第 i n d e x index index 个维度上的取值记作 v i n d e x v_{index} vindex

这里我们约定 i n d e x index index 的取值从 1 1 1 开始,即 v = ( v 1 , v 2 , … , v n ) v=(v_1,v_2,…,v_n) v=(v1,v2,,vn)

下面介绍一种向量的稀疏表示方法。

如果 v v v 仅在少量维度上的取值不为 0 0 0,则称其为稀疏向量。

例如当 n = 10 n=10 n=10 时, v = ( 0 , 0 , 0 , 5 , 0 , 0 , − 3 , 0 , 0 , 1 ) v=(0,0,0,5,0,0,-3,0,0,1) v=(0,0,0,5,0,0,3,0,0,1) 就是一个稀疏向量。

由于稀疏向量的非零值较少,我们可以通过仅存储非零值的方式来节省空间。

具体来说,每个非零值都可以用一个 ( i n d e x , v a l u e ) (index, value) (index,value) 对来表示,即该向量在第 i n d e x index index 个维度上的取值 v i n d e x = v a l u e ≠ 0 v_{index} = value ≠0 vindex=value=0

在上面的例子中, v v v 就可以表示为 [ ( 4 , 5 ) , ( 7 , − 3 ) , ( 10 , 1 ) ] [(4,5),(7,-3), (10,1)] [(4,5),(7,3),(10,1)]

接下来给出这种稀疏表示一般化的定义。

  • 对于任意一个 n n n 维整数向量 v ∈ Z n v \in \mathbb{Z}^n vZn,如果其在且仅在 a a a 个维度上取值不为 0 0 0,则可以唯一表示为: [ ( i n d e x 1 , v a l u e 1 ) , ( i n d e x 2 , v a l u e 2 ) , … , ( i n d e x a , v a l u e a ) ] [(index_1,value_1),(index_2,value_2),…,(index_a,value_a)] [(index1,value1),(index2,value2),,(indexa,valuea)]
  • 其中所有的 i n d e x index index 均为整数且满足: 1 ≤ i n d e x 1 < i n d e x 2 < … < i n d e x a ≤ n 1 \le index_1 < index_2 < … < index_a \le n 1index1<index2<<indexan
  • v a l u e i value_i valuei 表示向量 v v v 在对应维度 i n d e x i index_i indexi 上的非零值。

给出两个 n n n 维整数向量 u , v ∈ Z n u,v \in \mathbb{Z}^n u,vZn 的稀疏表示,试计算它们的内积。

u ⋅ v = ∑ i = 1 n u i ⋅ v i u \cdot v = \sum_{i=1}^n u_i \cdot v_i uv=i=1nuivi

输入格式

第一行包含用空格分隔的三个正整数 n 、 a n、a na b b b,其中 n n n 表示向量 u 、 v u、v uv 的维数, a a a b b b 分别表示两个向量所含非零值的个数。

第二行到第 a + 1 a+1 a+1 行输入向量 u u u 的稀疏表示。第 i + 1 i+1 i+1 行( 1 ≤ i ≤ a 1 \le i \le a 1ia)包含用空格分隔的两个整数 i n d e x i index_i indexi v a l u e i value_i valuei 表示 v i n d e x i = v a l u e i ≠ 0 v_{index_i} = value_i ≠ 0 vindexi=valuei=0

a + 2 a+2 a+2 行到第 a + b + 1 a+b+1 a+b+1 行输入向量 v v v 的稀疏表示。第 j + a + 1 j+a+1 j+a+1 行( 1 ≤ j ≤ b 1 \le j \le b 1jb)包含用空格分隔的两个整数 i n d e x j index_j indexj v a l u e j value_j valuej 表示 v i n d e x j = v a l u e j ≠ 0 v_{index_j} = value_j ≠ 0 vindexj=valuej=0

输出格式

输出一个整数,表示向量 u u u v v v 的内积 u ⋅ v u \cdot v uv

数据范围

输入数据保证 0 < a , b < n 0< a,b < n 0<a,b<n;
向量 u u u v v v 在每一维度上取值的绝对值 ∣ u i ∣ , ∣ v i ∣ ≤ 1 0 6 ( 1 ≤ i ≤ n ) |u_i|,|v_i| \le 10^6 (1 \le i \le n) ui,vi106(1in)
QQ截图20210225163412.png

输入样例:
10 3 4
4 5
7 -3
10 1
1 10
4 20
5 30
7 40
输出样例:
-20
样例解释

u = ( 0 , 0 , 0 , 5 , 0 , 0 , − 3 , 0 , 0 , 1 ) u = (0,0,0,5,0,0,-3,0,0,1) u=(0,0,0,5,0,0,3,0,0,1)
v = ( 10 , 0 , 0 , 20 , 30 , 0 , 40 , 0 , 0 , 0 ) v = (10,0,0,20,30,0,40,0,0,0) v=(10,0,0,20,30,0,40,0,0,0)
u ⋅ v = 5 × 20 + ( − 3 ) × 40 = − 20 u \cdot v = 5 \times 20 + (-3) \times 40 = -20 uv=5×20+(3)×40=20

题目的思路也很简单,用两个列表存一下,然后双指针遍历一次就行了。
满分代码如下:

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

int main (){
    int n,a,b;cin>>n>>a>>b;
    LL h[a+1][2] , s[b+1][2];
    for(int i=1;i<=a;i++){
        cin>>h[i][0]>>h[i][1];
    }
    for(int i=1;i<=b;i++){
        cin>>s[i][0]>>s[i][1];
    }
    int l=1,r=1;
    LL sum = 0;
    while(l<=a && r <= b){
        if(h[l][0]<s[r][0]) {
            l++;
            continue;
        }
        if(h[l][0]>s[r][0]) {
            r++;
            continue;
        }
        if(h[l][0] == s[r][0]){
            sum += h[l++][1] * s[r++][1];
        }
    }
    cout<<sum;
    return 0;
}

在上一个题目后我已经一来就开LL了,但是。。。。。我只是给sum开了一个LL,没有考虑到两个int数组的数相乘也会爆int。。。

未完待续。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

strncpy陷阱

最近遇到了一个strncpy的bug&#xff0c;他们居然说这不是bug&#xff0c;而我认为这是很严重的bug&#xff01; 相比于strcpy来说&#xff0c;strncpy具有更高的安全性&#xff0c;但是同时会带来一个问题&#xff0c;就是c字符串不会自动补’\0’。 废话不多说&#xff0c;…

使用Docker安装 Skywalking(单机版)

使用Docker安装 Skywalking&#xff08;单机版&#xff09; 文章目录 使用Docker安装 Skywalking&#xff08;单机版&#xff09;Skywalking 介绍Skywalking 安装 Skywalking 介绍 Skywalking官网 分布式系统的应用程序性能监视工具&#xff0c;专为微服务、云原生架构和基于容…

GPU相关的一些截图

GPU相关的一些截图

【树和二叉树的相关定义】概念

1.回顾与概览 2.什么是树型结构 3.树的&#xff08;递归&#xff09;定义与基本术语 3.1树的定义 注意&#xff1a;除了根结点以外&#xff0c;任何一个结点都有且仅有一个前驱 3.2树的其他表示方式 3.3树的基本术语 结点&#xff1a;数据元素以及指向子树的分支根结点:非空…

OpenMV——色块追踪

Python知识&#xff1a; 1.给Python的列表赋值&#xff1a; 定义一个元组时就是 元组a (1,2,…) 元组中可以只有一个元素&#xff0c;但是就必须要加一个 “ , ” 如 a (2,) 而列表的定义和元组类似&#xff0c;只是把()换成[]: #那么下面的colour_1 ~ 3属于元组&#xf…

【leetcode C++】动态规划

动态规划解题思路 1. 状态表示 dp表 里面的值所代表的含义&#xff08;1.根据题目要求得出 2.经验 题目要求 3.分析问题过程中&#xff0c;发现重要子问题&#xff09; 2. 状态转移方程 dp[i] 等于什么 3. 初始化 保证填表不越界 4. 填表顺序 为了填写该状态的时候&am…

02 Docker基本管理

2.1 Docker镜像管理 2.1.1 案例&#xff1a;构建各类Docker镜像服务 2.1.2 案例环境 主机 操作系统 主机IP地址 服务器 Centos7.3x86-64 192.168.10.100 2.1.3 案例拓扑原理 通过 Dockerfile 创建常见应用镜像&#xff0c;Dockerfile 的构成如图 2.3 所示 图 2.1 Doc…

为什么说开放式耳机对耳朵更友好?性价比高的四款蓝牙耳机推荐

开放式耳机对耳朵更友好&#xff0c;主要体现在以下方面&#xff1a; 减少耳部闷热和潮湿&#xff1a;开放式耳机的开放结构&#xff0c;不会完全封闭耳朵&#xff0c;使得空气能够自由流通。这样可以有效减少因长时间佩戴导致的耳部闷热和潮湿情况。而耳部处于闷热潮湿的环境…

基于CNN-BiGUR的恶意域名检测方法

本文提出了一种基于 CNN 和 BiGRU 的恶意域名检测方法 CNN-BiGRU-Focal。利用卷积神经网络&#xff08;CNN&#xff09;提取域名字符的局部上下文特征。利用双向门控循环单元网络&#xff08;BiGRU&#xff09;捕捉域名字符序列的时间序列特征。同时&#xff0c;引入改进的 Foc…

十三、MySQL高级—读写分离(6)

&#x1f33b;&#x1f33b; 目录 一、Mycat 介绍1.1 是什么1.2 干什么的1.3 原理 二、安装启动2.1 解压缩文件拷贝到linux下 /usr/local/2.2 三个文件2.3 启动前先修改schema.xml&#xff08;配置&#xff09;2.4 再修改server.xml2.5 验证数据库访问情况2.6 启动程序2.7 启动…

Hive SQL子查询应用

目录 环境准备看如下链接 子查询 查询所有课程成绩均小于60分的学生的学号、姓名 查询没有学全所有课的学生的学号、姓名 解释: 没有学全所有课,也就是该学生选修的课程数 < 总的课程数。 查询出只选修了三门课程的全部学生的学号和姓名 环境准备看如下链接 环境准备h…

应用层 思维导图

绪论&#xff1a; ​“有志者自有千计万计&#xff0c;无志者只感千难万难。” 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 思维导图能很好的帮助到我们去学习和理解记忆知识&#xff0c;当我们对一个知识有了一定的框架后就能有逻辑性的去…

关于我的阿里云服务器被入侵 - 分析报告

目录 引言一、事件概述1. 异地登陆2. 挖矿程序3. 密钥未注册4. 勒索病毒 二、问题分析1. 异地登陆2. 挖矿程序3. 密钥登录失效&#xff08;密钥未注册&#xff09;4. 勒索病毒 三、安全知识讲解1. 密钥登录 四、总结 引言 因为是第一次租云服务器&#xff0c;所以出现了很多的…

Clion配置ESP32开发,一文就够了

目录 1.下载ESP-IDF2.配置ESP32开发环境2.1方法1:Clion官方手册2.2方法2: 3.测试Clion开发ESP32的环境4.关于Clion的monitor无法正常运行的解决方法 我这里使用的CLiion版本是2023.2.1&#xff0c;网上激活方法有很多&#xff0c;这里就不赘述。 电脑是WIn11系统。 1.下载ESP-I…

无线感知会议系列【1】【增强无线感知应用的鲁棒性】

前言&#xff1a; 这个是2021年 泛在可信智能感知论坛&#xff0c;汤战勇 &#xff08;西北大学物联网研究院 )教授的 一个讲座《wireless signals like WiFi, RFID and (ultra) sound as a powerful modality for ubiquitous sensing》 参考连接&#xff1a; 4.见微知萌—…

02_硬件基础知识学习

通过上一课的学习&#xff0c;我们貌似成功的点亮了一个 LED 小灯&#xff0c;但是有一些知识大家还没彻底搞明白。单片机是根据硬件电路图的设计来编写代码的&#xff0c;所以我们不仅仅要学习编程知识&#xff0c;还要学习基本的硬件知识&#xff0c;这节课我们就要来穿插介绍…

萱仔环境记录——git的使用流程:以上传一个项目进入GitHub仓库为例子

前段时间我已经不使用学校的电脑了&#xff0c;在自己的笔记本上安装了git&#xff0c;准备好好把我这几年做的项目整理一下进行开源&#xff0c;由于前几次的面试&#xff0c;一些公司考核到了git的用法&#xff0c;虽然平时我也在使用git对自己的项目进行管理&#xff0c;但还…

为什么腾讯难以再现《黑神话:悟空》这样的游戏大作?

自《黑神话:悟空》发布以来,它凭借令人惊艳的画面和深入人心的故事情节,迅速在全球范围内收获了大量粉丝。这款游戏的成功,不仅让全球玩家看到了国产游戏的新高度,也让许多人开始好奇:作为中国游戏行业的巨头,腾讯为什么没能推出类似《黑神话:悟空》这样震撼的作品?今…

c++166面下该过程 向面向对象的转变

#include<iostream> using namespace std; //设计类 属性 函数 //案例一 &#xff1a;立方体 面积和体积 //求两个立方体是否相等 &#xff08;全局函数和成员函数&#xff09; class Cube { private:int m_a;int m_b;int m_c;int m_v;int m_s;public://void setA(int a…

视频剪辑软件大盘点:四款神级工具让你工作更高效!

工作中&#xff0c;视频剪辑是一项不可或缺的技能。而选择一款好用的视频剪辑软件&#xff0c;更是提升工作效率的关键。今天&#xff0c;我就将从功能、易用性、效果以及个人使用感受等方面为大家推荐四款免费的视频剪辑软件&#xff1a; 第一款&#xff1a;福昕视频剪辑 我…