第九次模拟测试-3

2023-10-31 16:11
文章标签 模拟 测试 第九次

本文主要是介绍第九次模拟测试-3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述 在瑞神大战宇宙射线中我们了解到了宇宙狗的厉害之处,虽然宇宙狗凶神恶煞,但是宇宙狗有一 个很可爱的女朋友。
最近,他的女朋友得到了一些数,同时,她还很喜欢树,所以她打算把得到的数拼成一颗树。
这一天,她快拼完了,同时她和好友相约假期出去玩。贪吃的宇宙狗不小心把树的树枝都吃掉 了。所以恐惧包围了宇宙狗,他现在要恢复整棵树,但是它只知道这棵树是一颗二叉搜索树,同 时任意树边相连的两个节点的gcd(greatest common divisor)都超过1。
但是宇宙狗只会发射宇宙射线,他来请求你的帮助,问你能否帮他解决这个问题。
补充知识:
GCD:最大公约数,两个或多个整数共有约数中最大的一个 ,例如8和6的最大公约数是2。
一个简短的用辗转相除法求gcd的例子:

int gcd(int a,int b)
{return b == 0 ? a : gcd(b,a%b);
}

输入描述 输入第一行一个t,表示数据组数。
对于每组数据,第一行输入一个n,表示数的个数
接下来一行有n个数 a i a_i ai,输入保证是升序的。 输出描述 每组数据输出一行,如果能够造出来满足题目描述的树,输出Yes,否则输出No。
无行末空格。 样例输入1
1 6 3 6 9 18 36 108
样例输出1
Yes
样例输入2
2 2 7 17 9 4 8 10 12 15 18 33 44 81
样例输出2
No Yes
样例解释 样例1可构造如下图
在这里插入图片描述
数据组成 给出的数为上限。
数据点数 t n a i a_i ai 1,2,3 5 15 1 0 9 10^9 109 4,5,6 5 35 1 0 9 10^9 109 7,8,9,10 5 700 1 0 9 10^9 109
题目分析:
本题可以用暴力解决,但是遇到四个点的时候就发现解决不了了,于是一分也没拿到QAQ。后来想了想这里实际上是一个动态规划问题,由于这是一个二叉搜索树,这样意味着他是有序的,也就是对于合适的数,看看他的两边的数是不是符合要求,如果符合要求了,那就把范围缩小到符合要求的范围当中,一直递归直到所有的点都符合那就符合要求,如果遇到了一个点不符合要求(比他小的比他大的都不能构成相邻的孩子)那就意味着不符合要求了。
不过如果仅仅这中递归会导致时间复杂度非常的高,因为重复操作太多了,所以我们把它分开,维护四个数组,两个是判断操作有没有进行过,两个是判断是不是可行,l意味着从左孩子到自己,r意味着从自己到右孩子。

bool al[710][710];
bool ar[710][710];
bool cl[710][710];
bool cr[710][710]

然后就可以开始检测了,如果发现对应范围内的数组都已经检测过了,就看他的结果是不是满足要求。(这里要注意你的范围是闭区间,所以要++表示是下一个的开头)

	if(al[l+1][n+1]==true&&ar[n+1][r+1]==true){if(cl[l+1][n+1]==true&&cr[n+1][r+1]==true){return true;}else{return false;}}

当然了,如果递归到后来发现左孩子或者右孩子和自己重合了,那也意味着成功了,因为这样就意味着不断的递归过程中都满足要求(否则就不敌跪了,直接返回false),所以是符合要求了。

	if(l>=n-1&&r<=n+1){return true;}

如果发现还没有经历过,那就对中间的每一个gcd都大于1的点进行遍历,如果符合要求了或者发现左右孩子和自己重合了(原因见上)就符合要求,然后更新数组,记录状态。右边和左边是一样的,只不过是符号不用而已

	if(al[l+1][n+1]==false){bool judgel=false;if(l==n-1){judgel=true;}for(int u=l+1;u<n;u++){if(gcda[u][n]>1){if(try_(l,u,n)==true){judgel=true; }}}al[l+1][n+1]=true;cl[l+1][n+1]=judgel;}if(ar[n+1][r+1]==false){bool judger=false;if(r==n+1){judger=true;}for(int u=n+1;u<r;u++){if(gcda[n][u]>1){if(try_(n,u,r)==true){judger=true; }}}ar[n+1][r+1]=true;cr[n+1][r+1]=judger;}

然后就可以进行判断是不是符合要求了。

	if(cl[l+1][n+1]==true&&cr[n+1][r+1]==true){return true;}else{return false;}

这样我们首先输入他们的gcd,当然gcd运算是可交换的,所以对于存储而言我们可以扫描半边,然后另一半通过手动来加入。

		for(int i=0;i<n;i++){for(int j=i;j<n;j++){gcda[i][j]=gcd(a[i],a[j]);gcda[j][i]=gcda[i][j];}}

之后对着0到n-1的范围扫描每一个数是不是符合要求就可以了。

		bool judge=false;for(int i=0;i<n;i++){if(try_(-1,i,n)==true){judge=true;break;}}

当然了,他要求的是不能有多余的行,那么我们在非最后一行就输出换行,其余的不输出换行。

		if(t!=temp-1){cout<<endl;}

代码如下:

#include<iostream>
#include<cstring>
using namespace std;
int a[710];
int gcda[710][710];
bool al[710][710];
bool ar[710][710];
bool cl[710][710];
bool cr[710][710];
int gcd(int a,int b)
{if(b==0){return a;}else{return gcd(b,a%b);}
}
bool try_(int l,int n,int r)
{if(al[l+1][n+1]==true&&ar[n+1][r+1]==true){if(cl[l+1][n+1]==true&&cr[n+1][r+1]==true){return true;}else{return false;}}if(l>=n-1&&r<=n+1){return true;}if(al[l+1][n+1]==false){bool judgel=false;if(l==n-1){judgel=true;}for(int u=l+1;u<n;u++){if(gcda[u][n]>1){if(try_(l,u,n)==true){judgel=true; }}}al[l+1][n+1]=true;cl[l+1][n+1]=judgel;}if(ar[n+1][r+1]==false){bool judger=false;if(r==n+1){judger=true;}for(int u=n+1;u<r;u++){if(gcda[n][u]>1){if(try_(n,u,r)==true){judger=true; }}}ar[n+1][r+1]=true;cr[n+1][r+1]=judger;}if(cl[l+1][n+1]==true&&cr[n+1][r+1]==true){return true;}else{return false;}		
}
int main()
{int t;cin>>t;int temp=t;while(t--){if(t!=temp-1){cout<<endl;}memset(al,0,sizeof(al));memset(ar,0,sizeof(ar));memset(cl,0,sizeof(cl));memset(cr,0,sizeof(cr));int n;cin>>n;for(int i=0;i<n;i++){cin>>a[i];}for(int i=0;i<n;i++){for(int j=i;j<n;j++){gcda[i][j]=gcd(a[i],a[j]);gcda[j][i]=gcda[i][j];}}bool judge=false;for(int i=0;i<n;i++){if(try_(-1,i,n)==true){judge=true;break;}}if(judge==true){cout<<"Yes";}else{cout<<"No";}}
}

这篇关于第九次模拟测试-3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/316550

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+