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

第一题 线性分类器

考虑一个简单的二分类问题——将二维平面上的点分为 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.rhkb.cn/news/420854.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统 --- 线程(Threads)概念 多线程模型 线程控制与组织

零、学习路线 一、线程的引入&#xff0c;什么是线程&#xff0c;为什么要引入线程&#xff1f; 如果说&#xff0c;在OS中引入进程的目的是为了使多个程序能并发执行&#xff0c;以提高资源利用率和系统吞吐量&#xff0c;那么&#xff0c;在操作系统中再引入线程&#xff0c…

Tableau 2024.3 快来了,你期待哪些新功能?

时隔不久&#xff0c;Tableau 再次发力&#xff0c;即将推出 2024.3 新版本&#xff01; 今年 7 月&#xff0c;Tableau 2024.2 的发布为数据分析领域带来了诸多创新。 时隔不久&#xff0c;Tableau 再次发力&#xff0c;即将推出 2024.3 新版本&#xff01;届时&#xff0c;将…

掌握动态文档生成的艺术:探索Python的docxtpl库

文章目录 掌握动态文档生成的艺术&#xff1a;探索Python的docxtpl库1. 背景介绍2. 库简介3. 安装指南4. 基础函数介绍5. 实际应用场景6. 常见问题及解决方案7. 总结 掌握动态文档生成的艺术&#xff1a;探索Python的docxtpl库 1. 背景介绍 在数据处理和自动化办公领域&#x…

今天讲点简单的:进制1

啊&#xff0c;哈喽&#xff0c;小伙伴们&#xff0c;大家好。我是#Y清墨&#xff0c;今天呐&#xff0c;我要介绍的是二进制。 导语 好久不见&#xff0c;今天来玩些简单的——二进制。 一.初步认识 十进制是逢十进一&#xff0c;那么&#xff0c;顾名思义&#xff0c;二进制…

QXlsx编译静态库-配置为Qt模块

Qt读写Excel–QXlsx编译为静态库-配置为Qt模块&#x1f346; 文章目录 Qt读写Excel--QXlsx编译为静态库-配置为Qt模块&#x1f346;[toc]1、概述&#x1f954;2、准备工作&#x1f955;3、配置环境&#x1f33d;4、加载QXlsx静态库&#x1f952; &#x1f449;QXlsx使用&#x…

Golang | Leetcode Golang题解之第389题找不同

题目&#xff1a; 题解&#xff1a; func findTheDifference(s, t string) (diff byte) {for i : range s {diff ^ s[i] ^ t[i]}return diff ^ t[len(t)-1] }

编曲术语:各种段落的英文表示 Cubasis和Cubase联合编曲

在编曲中&#xff0c;常见的段落英文表示如下&#xff1a; 前奏&#xff08;Intro&#xff09;&#xff1a;通常是歌曲开头的部分&#xff0c;用于引入主题&#xff0c;营造氛围。 主歌&#xff08;Verse&#xff09;&#xff1a;歌曲的主要叙述部分&#xff0c;一般有多段&am…

国庆假期出行必备!西圣PB充电宝!外出旅游出行好搭档!

随着国庆假期的脚步日益临近&#xff0c;大家的心早已飞向了那片期待已久的远方。无论是计划着与家人共赴山水之间&#xff0c;还是与好友相约城市探索&#xff0c;一场说走就走的旅行总是让人心潮澎湃。然而&#xff0c;在享受旅途的欢乐与自由时&#xff0c;手机电量不足的问…

力扣题解2552

大家好&#xff0c;欢迎来到无限大的频道。 今天和大家分享的是2552的题解思路。 题目描述&#xff1a; 统计上升四元组 一个长度为 n 下标从 0 开始的整数数组 nums &#xff0c;它包含 1 到 n 的所有数字&#xff0c;请你返回上升四元组的数目。 如果一个四元组 (i, j, …

JavaScript高级进阶(二)

JS弹窗 弹窗与语法 警告窗 window.alert()//用于确保用户可以得到某些信息 确认窗 window.confirm()//用于验证是否接受用户操作 提示窗 window.prompt()//用于提示用户在进入页面前输入某个值 <script> //警告窗 alert(欢迎光临); //提示框 var str prompt(是不是…

线程(Thread)

目录 线程&#xff08;Thread&#xff09; 线程的创建方式 实现方式 Runnable和Callable的区别 线程的命名和优先级 线程的六种状态 线程的插队 线程的中断 线程的让出 守护线程 设置线程为守护线程 sleep()和wait()的区别 线程的同步synchronized锁 语法格式 实现…

使用kubeadm部署k8s集群

1、简介 K8s部署主要有两种方式&#xff1a; 1、Kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。 2、二进制 从github下载发行版的二进制包&#xff0c;手动部署每个组件&#xff0c;组成Kubernetes集…

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署WordPress网站

828华为云征文&#xff5c;华为云Flexus云服务器X实例之openEuler系统下部署wordpress网站 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、WordPress介绍2.1 WordPress简介2.2 WordPress主要特点…

有什么免费好用的ai写作软件?2024帮助你快速进行写作的软件

有什么免费好用的ai写作软件&#xff1f;2024帮助你快速进行写作的软件 AI写作软件如今在提升写作效率、生成灵感、以及帮助完成复杂的写作任务方面表现得越来越出色。以下是五款免费且好用的AI写作软件&#xff0c;它们能够帮助你快速进行写作&#xff0c;无论是博客文章、市…

面试官:为什么 Redis 6.0 之后引入多线程?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 回答 Redis 的性能瓶颈从来都不是 CPU&#xff0c;是网络I/O 和内存。 内存好解决&#xff0c;加机器内存和优化数据结构。 网路 I/O 的优化才是大头&#xff0c;因为读写网络的 read…

U盘格式化怎么办?这4款软件可以帮你进行数据恢复。

如果你的U 盘被格式化&#xff0c;里面的数据就会被清除掉了。有备份的话&#xff0c;就不用担心丢失那些重要的数据&#xff1b;如果没有备份&#xff0c;也有办法解决&#xff1b;可以用电脑自带的一些功能恢复&#xff0c;或者是使用专业的恢复软件。如果大家有需求&#xf…

【MTC拾取放置示例】将Connect中的最大目标偏差检查增加到1e-2,实现move to pick/move to place

问题描述 在运行Moveit2使用MTC构建拾取放置示例Pick and Place with MoveIt Task Constructor的时候出现报错 move to pick规划失败 “The computed trajectory is too short to detect jumps in joint-space. Need at least 10 steps, only got 2. Try a lower max_step”…

自带线充电宝哪个牌子质量好性价比高?口碑最好自带线充电宝

在如今这个快节奏的时代&#xff0c;手机等电子设备已经成为我们生活中不可或缺的一部分。然而&#xff0c;电量不足的困扰时常让我们陷入尴尬境地。自带线充电宝的出现&#xff0c;无疑为我们解决了这一难题。它不仅方便携带&#xff0c;无需再额外携带充电线&#xff0c;而且…

iphone16-iphone16pro原壁纸分享

iphone16-iphone16pro原壁纸分享 苹果公司在2024年9月10日的秋季新品发布会上正式推出了iPhone 16系列智能手机。以下是iPhone 16系列的主要特点和更新&#xff1a; 全新A18芯片&#xff1a;iPhone 16系列搭载了苹果最新的A18芯片&#xff0c;这款芯片专为苹果智能&#xff08;…

2024年CCPC网络赛K题题解 —— 取沙子游戏(gym105336K)

比较新的一类博弈题&#xff0c;考虑对因子的处理。题面&#xff1a; 在网络赛以前&#xff0c;我曾经做到过一道类似的题目&#xff1a; Bob和Alice和两堆石头&#xff0c;一堆有s1个&#xff0c;另一堆有s2个&#xff0c;然后Alice先手&#xff0c;每个人每次可以选择一堆石头…