当前位置:网站首页>acwing每日一题 正方形数组的数目
acwing每日一题 正方形数组的数目
2022-07-27 05:21:00 【最后一只三脚兽】
题目思路
- 直接排列后检查会TLE,因此直接在排序过程中对两个临值是否满足要求进行检测,如果不满足直接剪枝,大大减少了时间复杂度(因为满足要求的很少)
- 其次,对排列进行查重,简单的办法是把每个数以哈希表形式进行存储,每次利用迭代器迭代每一种数,用过减少次数即可。这里用的是Y总教的查重方法,对我有点难度,从弄懂到独立写出代码折腾了1个小时,hh
y总查重方法介绍,不保证能说明白,当作自己的笔记了
当我们把数组排序之后,重复的数字就到了一起,把重复的数字集合当作一个区间。如果想保证每个排列不重复只要能够保证该位置取的数字只在这个区间取一次即可。
y总的方法是保证每次取得的数是第一次在这个区间取的,由于每个数字的排列取值是从数组从前往后遍历检查,对于下面的图片
由于是从前往后检查,在第一次排列中第一个数一定是红色的2,第二个一定是蓝色的2,第三次一定是黄色的2,该次排列结束后回溯,第二个2到了黄色的2位置,此时发现前面蓝色的2没有位置用,说明该数字已经不是第一次用了,直接结束,回溯到第一个2,第一个·2要遍历到蓝色的。2,此时发现前面2没有位置取,说明也不是第一次取这个数了,直接结束
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
int cnt = 0;
int n;
int w[15];
bool used[15];
bool check(int sum){
//检查两数之和是否为平方数
int x = sqrt(sum);
return x*x == sum;
}
void permutation(int t,int last){
if(t == n){
cnt++;//顺利走到这说明是正方形数组
return;
}
for(int i=0; i< n; i++){
if(used[i])continue;
if(i && !used[i-1] && w[i] == w[i-1])continue;//检测是否是第一次用该区间的数字
if(t && !check(w[i] + last))continue;//如果是取第一个位置的数,不用检查前面的数与该数字之和是否是平方数
used[i] = true;
permutation(t+1, w[i]);
used[i] = false;
}
}
int main(){
cin>>n;
for(int i=0; i<n; i++)cin>>w[i];
sort(w,w+n);
permutation(0,0);
cout<<cnt<<endl;
}
边栏推荐
- Stm32-fsmc extended memory SRAM
- Greedy high performance neural network and AI chip application research and training
- 2022.6.10 STM32MP157串口时钟的学习
- STM32 infrared remote control
- Xmind 思维导图 2022 v12.0.3中文版更新了哪些内容?
- 【Arduino】重生之Arduino 学僧(1)
- 18. Convolutional neural network
- 9. High order operation
- ps 2022 六月更新,都新增了哪些功能
- 编程学习记录——第5课【分支和循环语句】
猜你喜欢
随机推荐
[high concurrency] interviewer
安装windows下的redis
Cmder的基础文件操作
C语言-动态内存管理
【Unity URP】代码获取当前URP配置UniversalRendererData,并动态添加RendererFeature
[MySQL learning] 8
C语言-自定义结构类型
古老的艺术-用好长尾关键词
【头歌】重生之CNN图片分类基础
解决conda install 安装停止、中断问题
回调使用lambda
10. Gradient, activation function and loss
导数、偏导数以及梯度
韦东山 数码相框 项目学习(三)freetype的移植
编程学习记录——第8课【数组与设计五子棋,扫雷游戏】
[song] rebirth of me in py introduction training (5): List
剪枝-量化-转onnx中文系列教程
A photo breaks through the face recognition system: you can nod your head and open your mouth, netizens
socket编程二:使用select
SoK: The Faults in our ASRs: An Overview of Attacks against Automatic Speech Recognition (题目过长)阅读笔记









![[high concurrency] interviewer](/img/50/baa662cb4ce30cf2ef4cb5952960dd.jpg)