真题集P93---2017年计专真题
创始人
2024-02-24 01:31:23

真题集P93---2017年计专真题

    • 思路:模拟
    • 代码
    • 思路
      • 一:哈希表法
      • 二:排序法 (利用排序去重)
      • 三:拓展
    • 代码(仅思路一)

在这里插入图片描述

思路:模拟

1、接口介绍

int turnNum(int num[], int nums):拿来一个数组,将之表示的二进制数转化成为十进制
bool is_valid(int path[], int n, int sum, int times):判断当前生成的路径是不是符合题意的路径
void dfs(int path[], int n, int sum, int times):生成全排列的函数,在产生的元素个数等于2^n时候进行判断该序列合不合法,合法就输出,让所有一切别的产生序列函数停止

2、设计思路
<1>输入n,需要对2^n个位置,产生0或者1,用dfs产生全排列,当个数达到要求,判断该序列是否合法
<2>拿到序列之后,用指针i从头扫到尾,在每个i出,连续提取n个数,放入数组,转化成10进制,看出现过了吗,未出现过,计数,最后计数为2^n个,为合法序列

代码

在连续取数时候,为了防止越界,且根据题意,用循环的方式即可

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
bool find_ans = false;
int turnNum(int num[], int nums) {//转十进制int ans = 0;for (int i = 0; i < nums; i++) {ans = ans * 2 + num[i];}return ans;
}
bool is_valid(int path[], int n, int sum, int times) {bool visit[1000];int num = 0;for (int i = 0; i < sum; i++) {visit[i] = false;}for (int i = 0; i < n; i++) {int cur[1000] = {};int j = 0;//记录从path中,从i后面,抽取出的第j个数,共抽取出times个,times表示2^n中的nwhile (j < times) {int p = path[i % sum + j];//根据题意,如果最后越界,采用循环的方式cur[j++] = p;//送到cur数组准备一会转化成十进制数}int tmp = turnNum(cur, times);if (!visit[tmp]) {visit[tmp] = true;num++;}}if (num == sum) {return true;}return false;
}
void dfs(int path[], int n, int sum, int times) {//参数:记录排列的数组,数组中元素个数,总共应该有多少个元素,2^n中的nif (n == sum) {//此次排列产生完毕if (is_valid(path, n, sum, times)) {find_ans = true;//说明已经找到答案,让别的函数见到此快速退出for (int i = 0; i < n; i++) {cout << path[i] << ' ';}}return;}if (find_ans) {//已经找到答案,快速退出 return;}path[n] = 0;dfs(path, n + 1, sum, times);path[n] = 1;dfs(path, n + 1, sum, times);return;
}
void function_six() {int n;cin >> n;int sum = pow(2, n);int path[1000] = {};dfs(path, 0, sum, n);return;
}

在这里插入图片描述

思路

一:哈希表法

1、选一个链作为主链,先扫一遍,把元素放入对应的哈希表,注意,最后指针要停在最后一个节点上。
2、进入副链,当前元素,未在之前集合出现,连在主链末尾。
3、一定注意,数据域是整数,包括正整数,负整数,0,所以用两个数组模拟哈希。

二:排序法 (利用排序去重)

这个方法在求并集时候并不好用,作为了解,过程如下
在这里插入图片描述
在这里插入图片描述

三:拓展

一旦不求并集,而改求交集,那么排序法就很好,过程如下:
在这里插入图片描述
链表冒泡排序见第八章–排序

代码(仅思路一)

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef struct node {int val;node* next;
};
node* function_seven(node* q, node* p) {bool hash[10000];//代表正数哈希bool hash_ano[10000];//代表负数哈希for (int i = 0; i < 10000; i++) {hash[i] = false;hash_ano[i] = false;}node* cur = q;//q链作为主链,之后全往q链上面挂while (cur->next != nullptr) {cur->val >= 0 ? hash[cur->val] = true : hash_ano[abs(cur->val)] = true;//根据正负放入正确的哈希表cur = cur->next;}node* last = p;while (last != nullptr) {if (last->val >= 0 && hash[last->val]) {//在正确的哈希表中找是否出现过last = last->next;continue;}if (last->val < 0 && hash_ano[abs(last->val)]) {//在正确的哈希表中找是否出现过last = last->next;continue;}last->val >= 0 ? hash[last->val] = true : hash_ano[abs(last->val)] = true;//根据数值存入正确的哈希表node* tmp = last;//连接节点,先标记这个节点last = last->next;cur->next = tmp;cur = tmp;cur->next = nullptr;}return q;//返回主链
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...