牛客小白月赛103(打表、二进制、几何、思维)

news2024/11/8 9:40:48

文章目录

  • 牛客小白月赛103(打表、二进制、几何、思维)
    • A. 小冰的正多边形
    • B. 冰冰的电子邮箱
    • C. 冰冰的异或(打表、二进制)
    • D. 冰冰的分界线(几何、浮点数处理)
    • E. 冰冰的 GCD(调和级数、思维)


据说F是假题,就没看了。


牛客小白月赛103(打表、二进制、几何、思维)

A. 小冰的正多边形

根据题意,判断是否可以构成正三角形。如可以,答案取周长最小的正三角形的周长。

#include<bits/stdc++.h>

using namespace std;

int main(){
    
    int ncase;
    cin >> ncase;
    
    while(ncase--){
        int n;
        cin >> n;
        map<int, int> m;
        int res = 1e9, x;
        for(int i = 1; i <= n; i++){
            cin >> x;
            m[x]++;
            if(m[x] == 3) res = min(res, 3 * x);
        }
        if(res == 1e9) cout << "no" << endl;
        else{
            cout << "yes" << endl;
            cout << res << endl;
        }
    }
    
    return 0;
}

B. 冰冰的电子邮箱

字符串处理,根据题意判断即可。

#include<bits/stdc++.h>

using namespace std;

int check_char(char c){
    if(c >= 'a' && c <= 'z') return 1;
    if(c >= 'A' && c <= 'Z') return 1;
    if(c >= '0' && c <= '9') return 1;
    return 0;
}

int main(){
    
    int ncase;
    cin >> ncase;
    
    while(ncase--){
        string s;
        cin >> s;
        string a, b;
        int flag = 0;
        for(auto c : s){
            if(c == '@' && flag == 0) flag = 1;
            else if(flag == 0) a += c;
            else b += c;
        }
        int res = 1;
        
        if(a.size() == 0 || a.size() > 64) res = 0;
        for(int i = 0; i < a.size(); i++){
            if(check_char(a[i]) == 0){
                if(a[i] == '.'){
                    if(i == 0 || i+1 == a.size()) res = 0;
                    else continue;
                }
                else res = 0;
            }
        }
        
        if(b.size() == 0 || b.size() > 255) res = 0;
        for(int i = 0; i < b.size(); i++){
            if(check_char(b[i]) == 0){
                if(b[i] == '.' || b[i] == '-'){
                    if(i == 0 || i+1 == b.size()) res = 0;
                    else continue;
                }
                else res = 0;
            }
        }
        
        cout << (res ? "Yes" : "No") << endl;
        
    }
    
    return 0;
}

C. 冰冰的异或(打表、二进制)

观察输入 n 的范围,单次查询需要在O(1) 或 O(log(n)) 的时间内,打表观察规律, r e s = 2 ⌈ l o g ( n ) ⌉ , n > 2 res = 2^{\lceil {log(n)} \rceil}, n > 2 res=2log(n),n>2

PS:这里的打表,即暴力枚举对于每一个 n,观察 n 与其对应的答案的规律。

对于规律的证明:

对于 4 为二进制,取X = 1000,设 Y = 0ABC, ABC为任意的01,此时,可以得到 [ 100 0 2 , 111 1 2 ] [1000_2, 1111_2] [10002,11112] 之间的所有数。

取X = 0100,设 Y = 00BC, BC为任意的01,此时,可以得到 [ 010 0 2 , 011 1 2 ] [0100_2, 0111_2] [01002,01112] 之间的所有数。

取X = 0010,设 Y = 000C, C为任意的01,此时,可以得到 [ 001 0 2 , 001 1 2 ] [0010_2, 0011_2] [00102,00112] 之间的所有数。

取X = 0001,设 Y = 0000, C为任意的01,此时,可以得到 [ 000 1 2 , 000 1 2 ] [0001_2, 0001_2] [00012,00012] 之间的所有数。

根据题意,Y ≠ 0,故而,上述四种情况中,需要排除左端点 100 0 2 、 010 0 2 、 001 0 2 、 000 1 2 1000_2、0100_2、0010_2、0001_2 10002010020010200012 。即,除这四个数外,其他数都可以被覆盖。


考虑覆盖这四个数:

即, 001 1 2 ⨁ 001 0 2 = 000 1 2 , 001 1 2 ⨁ 000 1 2 = 001 0 2 , 010 1 2 ⨁ 000 1 2 = 010 0 2 0011_2 \bigoplus 0010_2 = 0001_2,0011_2 \bigoplus 0001_2 = 0010_2,0101_2 \bigoplus 0001_2 = 0100_2 0011200102=000120011200012=001020101200012=01002

由于 001 1 2 ⨁ 001 0 2 = 000 1 2 0011_2 \bigoplus 0010_2 = 0001_2 0011200102=00012,当 n 大于 2 时,才能构造出 1。

同时,可以发现, 100 0 2 1000_2 10002 是无法用 1 ~ n 的数进行异或得到。


综上,当 n > 2时,对于 n:

  • n > 2 时, 2 ⌈ l o g ( n ) ⌉ 2^{\lceil {log(n)} \rceil} 2log(n) 是无法被表示的为 2 ⌈ l o g ( n ) ⌉ 2^{\lceil {log(n)} \rceil} 2log(n) ,即 n 在二进制表示时的最高位
  • n <= 2 时,1 无法被表示
#include<bits/stdc++.h>

using namespace std;

int main(){
    
    int ncase;
    cin >> ncase;
    
    while(ncase--){
        long long n;
        cin >> n;
        long long res = 0, x = n;
        while(x) res++, x /= 2;
        res -= (pow(2, res-1) == n);
        if(n <= 2) cout << 1 << endl;
        else cout << (long long)(pow(2, res)) << endl;
    }
    
    return 0;
}

D. 冰冰的分界线(几何、浮点数处理)

枚举所有点对,对能构成的直线去重即可。(”点对“:题目给出n个点中,任意两个不同的点)

显然难点在于:如何表示直线?浮点数如何处理?(浮点数存储原理,不懂的自行百度)


题目所求的直线,就是每个点对所连成的线段的垂线所在的直线。

如下图所示,y1就是点对AB所满足的直线。(y1 垂直于 AB)

在这里插入图片描述


两点确定一条直线,但是对于直线y1,已知只有一个点C。

考虑更多的信息,y1是线段AB的垂线,即 k A B ∗ k y 1 = − 1 k_{AB} * k_{y1} = -1 kABky1=1,求出线段AB所在直线的斜率 k 即可得到 y1的斜率 k y 1 k_{y1} ky1

有点 C 的坐标和斜率斜率 k y 1 k_{y1} ky1,即可确认 y1。


对于斜率k,肯定是不能使用浮点数存储的,考虑使用方向向量替代斜率。

k = B / A , B = ( y 1 − y 2 ) , A = ( x 1 − x 2 ) k = B / A, B = (y1 - y2), A = (x1 - x2) k=B/A,B=(y1y2),A=(x1x2),其中 ( A , B ) (A,B) (A,B) 即为直线的方向向量。

对于点对AB,求出其方向向量 ( A , B ) (A, B) (A,B),根据 k A B ∗ k y 1 = − 1 k_{AB} * k_{y1} = -1 kABky1=1,得到 y1 的方向向量。


根据 y = k x + b y = kx + b y=kx+b,求出 b,即可确定唯一的直线。

对于 y = k x + b y = kx + b y=kx+b,带入 k = B / A k = B / A k=B/A ,得到 y = B / A ∗ x + b y = B / A * x + b y=B/Ax+b

显然,直接表示 b b b 容易出现小数。为了避免小数对等式两边同乘A,得到 A y = B ∗ x + A b Ay = B * x + Ab Ay=Bx+Ab

使用 A b Ab Ab 与直接使用 b b b 有相同的效果。

对于相同的 ( A , B ) (A,B) (A,B),记录不同的 A b Ab Ab 的数量,求和即可。


最后一点细节,向量 ( A , B ) (A,B) (A,B)而言:

比如 ( 1 , 2 ) 、 ( 2 , 4 ) 、 ( − 3 , − 6 ) (1,2)、(2,4)、(-3,-6) (1,2)(2,4)(3,6),他们三个表示的是同一个向量,需要统一。

A A A 大于零, A A A B B B 都除 g c d ( a b s ( A ) , a b s ( B ) ) gcd(abs(A), abs(B)) gcd(abs(A),abs(B)) 即可。

同时,注意A无穷大的情况。(k不存在,x1 = x2)

#include<bits/stdc++.h>

using namespace std;

const int maxn = 1e3 + 5;
int x[maxn], y[maxn];

map<pair<int, int>, int> ID;
set<int> s[maxn * maxn];

int ids = 0;
int get_id(pair<int, int> p){
	if(ID[p] == 0) return ID[p] = ++ids;
	else return ID[p];
}

int gcd(int a, int b){
	if(b == 0) return a;
	else return gcd(b, a % b);
}

void init(){
	for(int i = 0; i <= ids; i++) s[i].clear();
	ids = 0; ID.clear();	
}

int main(){
    
	int ncase;
	cin >> ncase;
	
	while(ncase--){
		int n;
		cin >> n;
		for(int i = 1; i <= n; i++) cin >> x[i];
		for(int i = 1; i <= n; i++) cin >> y[i];
		
		for(int i = 1; i <= n; i++){
			for(int j = i+1; j <= n; j++){
				int A = -1 * (y[i] - y[j]), B = x[i] - x[j]; // 原直线的法向量,即其垂线的方向向量 
				if(A == 0) s[0].insert(x[j] + x[i]); 		 // 一种特殊情况. k 无穷大 
				else{
					if(A < 0) A *= -1, B *= -1;
					int g = gcd(abs(A), abs(B));
                    A = A / g, B = B / g; // 计算最简的方向向量 
					pair<int, int> p = {A, B}; 
					int b = A * (y[i]+y[j]) - B * (x[i]+x[j]); // 计算 2Ab 
					s[get_id(p)].insert(b);
				}
			}
		}
		
		int res = 0;
		for(int i = 0; i <= ids; i++) res += s[i].size();
		cout << res << endl;
		
		init();
	}
    
    return 0;
}

E. 冰冰的 GCD(调和级数、思维)

根据题意,预处理出每个 f ( x ) f(x) f(x) g ( x ) g(x) g(x) 的值,O(1) 查询即可。


对于 f ( x ) f(x) f(x)的预处理:

逆序遍历排列 b b b,对于每个 b i b_i bi,设 p p p 表示满足 g c d ( b i , b p ) ≠ 1 gcd(b_i, b_p) ≠ 1 gcd(bi,bp)=1 的第一个位置,初始为 n − 1 n-1 n1

枚举 b i b_i bi 的所有因子 x x x。如因子 x x x,在之前的枚举出现过,令 p = m i n ( p , v [ x ] ) p = min(p, v[x]) p=min(p,v[x])。随后,更新 v [ x ] v[x] v[x],令 v [ x ] = i v[x] = i v[x]=i

枚举完所有因子后,

  • p = n − 1 p = n-1 p=n1,则 f ( i ) = b i f(i) = b_i f(i)=bi
  • 否则, f ( i ) f(i) f(i) = g c d ( b i , b p ) gcd(b_i, b_p) gcd(bi,bp)

时间复杂度: n ∗ ( n ) n*\sqrt(n) n( n)


对于 g ( x ) g(x) g(x) 的预处理:

顺序遍历排列 c,对于每个 c i c_i ci,枚举 i 的倍数,判断其倍数的位置在排列 a 中是否大于 c_i 即可。

时间复杂度: n ∗ l o g ( n ) n * log(n) nlog(n) ,调和级数,自行百度。

#include<bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 5;
int a[maxn], b[maxn], c[maxn];
int pa[maxn], pb[maxn];
int f[maxn], g[maxn], v[maxn];

int gcd(int a, int b){
    if(b == 0) return a;
    else return gcd(b, a % b);
}


int main(){

    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++) cin >> b[i];
    for(int i = 1; i <= n; i++) cin >> c[i];
    
    for(int i = 1; i <= n; i++) pb[b[i]] = i;
    for(int i = 1; i <= n; i++) pa[a[i]] = i;
    
	for(int i = n; i >= 1; i--){
		int x = b[i], p = n+1;
		for(int j = 1; j * j <= x; j++){ // 枚举 x 的因子 
			if(x % j == 0){
				if(j != 1 && v[j] > i) p = min(p, v[j]);
				if(v[x/j] > i) p = min(p, v[x/j]);
				v[j] = v[x/j] = i;
			}
		}
		f[i] = (p == n+1 ? b[i] : gcd(b[i], b[p]));
	}
    
    
    
    for(int i = 1; i <= n; i++){ // nlog(n)
        for(int j = i; j <= n; j += i){
            if(pa[j] >= c[i]){
                g[i]++;
            }
        }
    }
    
    while(m--){
        int x;
        cin >> x;
        cout << g[f[x]] << endl;
    }
    
    return 0;
}

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

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

相关文章

「C/C++」C++17 之 std::variant 安全的联合体(变体)

#1024程序员节&#xff5c;征文# ✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计…

Web3的去中心化社交网络:区块链技术如何改变互动方式

随着互联网技术的不断进步&#xff0c;社交网络正在经历一场深刻的变革。Web3&#xff0c;作为新一代互联网技术的代表&#xff0c;正通过区块链和去中心化理念改变着我们与他人互动的方式。传统的社交网络通常由大型公司控制&#xff0c;用户数据的集中化管理和隐私问题备受关…

代码随想录(十二)——图论

并查集 并查集主要有三个功能。 寻找根节点&#xff0c;函数&#xff1a;find(int u)&#xff0c;也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合&#xff0c;函数&#xff1a;join(int u, int v)&#xff0c;将两个节点连在同一个根节点上判断两个节点是否在…

HarmonyOS 5.0应用开发——文件读写

【高心星出品】 文章目录 文件读写文件操作创建目录删除目录或者文件扫描目录中文件 文本读写写入文本读取文本内容 文件读写文件写入边读边写 文件读写 Core File Kit&#xff08;文件基础服务&#xff09;为开发者提供一套访问和管理应用文件和用户文件的能力。帮助用户更高…

44-RK3588s调试 camera-engine-rkaiq(rkaiq_3A_server)

在RK3588s平台上调试imx415 camera sensor 过程中&#xff0c;已经识别到了camera sensor ID&#xff0c;并且可以拿到raw图和isp处理后的图像&#xff0c;但是isp处理后的图像偏绿&#xff0c;来看查看后台服务发现rkaiq_3A_server没有运行&#xff0c;然后单独运行rkaiq_3A_s…

Linux 宝塔安装(各操作系统命令合集)

由于CentOS官方已全面停止维护CentOS Linux项目&#xff0c;公告指出 CentOS 7和8在2024年6月30日停止技术服务支持&#xff0c;详情见CentOS官方公告。导致CentOS系统源已全面失效&#xff0c;比如安装宝塔等等会出现网络不可达等报错&#xff0c;需要切换源。系统源问题&…

Android 获取OAID

获取OAID 老规矩&#xff0c;直接上&#xff1a; implementation com.huawei.hms:opendevice:6.11.0.300 // 要获取华为vaid 和aaid&#xff0c;还需添加opendevice 依赖implementation(name: oaid_sdk_2.5.0, ext: aar) import android.content.Context; import android.util.…

基于微信小程序的公务员考试信息查询系统+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

【Android】Kotlin教程(4)

文章目录 1.field2.计算属性3.主构造函数4.次构造函数5.默认参数6.初始化块7.初始化顺序7.延迟初始化lateinit8.惰性初始化 1.field field 关键字通常与属性的自定义 getter 和 setter 一起使用。当你需要为一个属性提供自定义的行为时&#xff0c;可以使用 field 来访问或设置…

可以在线制作的PS网页版来了!

在当今数字化的创意时代&#xff0c;设计领域不断发展与变革&#xff0c;设计师们对于工具的需求也日益多样化和高效化。随着互联网技术的飞速进步&#xff0c;一种全新的设计工具模式应运而生——在线制作的 PS 网页版。它以其独特的优势和便捷性&#xff0c;逐渐成为众多设计…

高德地图如何添加自己店铺的位置信息?

众所周知&#xff0c;创业开店时&#xff0c;地理位置的选择至关重要。一个优越的地理位置不仅能显著提升店铺的可见度&#xff0c;还能有效吸引更多潜在顾客的光顾。而且&#xff0c;为了将店铺的客流量最大化&#xff0c;商家还需在地图平台上准确标注自己的位置信息&#xf…

【黄豆颗粒数据集】黄豆识别 机器视觉 深度学习(含数据集)

一、背景意义 随着全球农业生产的现代化&#xff0c;黄豆&#xff08;大豆&#xff09;作为一种重要的经济作物&#xff0c;广泛用于食品、饲料和工业原料的生产。准确识别和分类黄豆颗粒对于农业生产的管理、质量控制和市场分析具有重要意义。然而&#xff0c;传统的人工分类方…

JavaEE-多线程上

文章目录 线程概述进程/线程多线程的作用JVM关于线程资源的规范关于Java程序的运行原理 并发与并行并发(concurrency)并行(parallellism)并发编程与并行编程 线程的调度策略分时调度模型抢占式调度模型 创建线程线程类分析入门实现线程的第一种方式实现线程的第二种方式 线程的…

论文阅读:三星-TinyClick

《Single-Turn Agent for Empowering GUI Automation》 赋能GUI自动化的单轮代理 摘要 我们介绍了一个用于图形用户界面&#xff08;GUI&#xff09;交互任务的单轮代理&#xff0c;使用了视觉语言模型Florence-2-Base。该代理的主要任务是识别与用户指令相对应的UI元素的屏幕…

Tomcat servlet response关于中文乱码的经验

前言 最近修改老项目项目&#xff0c;使用zuul网关返回的中文内容乱码了&#xff0c;如果使用GBK或者GB2312编码确正常显示&#xff0c;稍微实验了一下&#xff0c;发现里面很多细节&#xff0c;毕竟Springboot对我们做了很多事情&#xff0c;而且当我们使用不同的模式会出现很…

服务器的免密登录和文件传输

在天文学研究中&#xff0c;通常会采用ssh登录服务器&#xff0c;把复杂的计算交给服务器&#xff0c;但是如果你没有进行额外的配置&#xff0c;那么登录服务器&#xff0c;以及和服务器进行文件传输&#xff0c;每次都要输入账号和密码&#xff0c;比较不方便&#xff0c;Win…

Windows Server NTFS磁盘变RAM的处理过程

问题描述 客户服务器的磁盘数据爆满&#xff0c;需要将磁盘进行扩容&#xff0c;因为是虚拟机所以先在虚拟化平台上将原来的磁盘空间改大&#xff0c;再进入系统&#xff0c;在磁盘管理器上将需要扩容的磁盘进行扩展。扩展完后系统报文件系统有问题&#xff0c;扩容的磁盘容量…

No.23 笔记 | WEB安全 - 任意文件漏洞 part 5

本文全面且深入地探讨了文件上传漏洞相关知识。从基础概念出发&#xff0c;清晰地阐述了文件上传漏洞的定义及其产生的本质原因&#xff0c;同时列出了该漏洞成立的必要条件。详细说明了文件上传漏洞可能对服务器控制权、网站安全以及业务运营带来的严重危害。 文中还深入解析了…

[mysql]子查询的概述和分类及单行子查询

子查询引入 查询的基本结构已经给大家了,子查询里面也是有一些新的内容,子查询其实就是在查询中嵌套另一个查询,叫嵌套查询可能大家更容易理解一点..,类似与FOR循环和FOR循环的嵌套,这一章是我们查询的最难的部分,大家 难度是查询的顶峰,多表查询和子查询是非常重要,SQL优化里…

EDA --软件开发之路

之前一直在一家做数据处理的公司&#xff0c;从事c开发&#xff0c;公司业务稳定&#xff0c;项目有忙有闲&#xff0c;时而看下c&#xff0c;数据库&#xff0c;linux相关书籍&#xff0c;后面跳槽到了家eda公司&#xff0c;开始了一段eda开发之路。 eda 是 electric design …