N诺刷题(基础算法)
目录
- 玛雅人的秘密
- 逆序对
玛雅人的秘密
玛雅人有一种密码,如果字符串中出现连续的2012四个数字就能解开密码。给一个长度为N的字符串,(2=<N<=13)该字符串中只含有0,1,2三种数字,问这个字符串要移位几次才能解开密码,每次只能移动相邻的两个数字。例如02120经过一次移位,可以得到20120,01220,02210,02102,其中20120符合要求,因此输出为1.如果无论移位多少次都解不开密码,输出-1。
输入输出格式
输入描述:
输入包含多组测试数据,每组测试数据由两行组成。
第一行为一个整数N,代表字符串的长度(2<=N<=13)。
第二行为一个仅由0、1、2组成的,长度为N的字符串。
输出描述:
对于每组测试数据,若可以解出密码,输出最少的移位次数;否则输出-1。
参考https://www.jianshu.com/p/fa96e0c90e0e思路。
将原始字符串看作树的根节点,进行一次交换的字符串作为子节点,依次往下交换,然后使用广度优先搜索(BFS)遍历这棵树,也就是层序遍历,每层的字符串对应一个 Map 值,含有2012的字符串在哪一层,就输出该层的 Map 值,如图 1 所示。保证树上的每个结点都不相同(map.find(key)查找是否有重复),直到穷尽。
#include<bits/stdc++.h>
using namespace std;
//const int maxn = 15;
queue<string> Q;//用于BFS树
map<string,int> M;//用于存树的每层字符串对应的值,字符串的高度-1string swap(string str,int i){//交换字符串第i和i+1 char temp;temp = str[i];str[i] = str[i+1];str[i+1] = temp;return str;
} int BFS(string str){string newStr;M.clear();//清空mapwhile(!Q.empty()) Q.pop();//清空队列Q.push(str);M[str] = 0;while(!Q.empty()){str = Q.front();Q.pop();//取出队首for(int i =0;i<str.length()-1;i++){ //循环对每一位进行交换newStr = swap(str,i);//str交换i和i+1if(M.find(newStr)==M.end()){//这个字符串没出现过 M[newStr] = M[str]+1;//加入mapif(newStr.find("2012")!=string::npos)//找到了2012 return M[newStr];elseQ.push(newStr);//不符合要求,继续bfs } } }return -1;// 遍历完,没有符合要求的字符串
}int main(){int n;string str;while(scanf("%d",&n) != EOF){cin >> str;if(n<4) cout<< -1<<endl;//肯定不符合要求else{if(str.find("2012") != string::npos)cout << 0;//初始字符串就有2012 elsecout << BFS(str)<<endl;} }return 0;
}
逆序对
猫猫 TOM 和小老鼠 JERRY 最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。
最近,TOM 老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中 ai>aj 且 i<j 的有序对。知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。
输入:
第一行,一个数 n,表示序列中有 n个数(n < 10^5)。
第二行 n 个数,表示给定的序列。序列中每个数字不超过 10^9。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 500010;int n;
int a[maxn],b[maxn];
long long ans = 0;
//归并排序
void merge(int L1,int R1,int L2,int R2){int i = L1,j = L2;int index = 0;//index为b数组的下标while(i<=R1 && j<=R2){if(a[i]<=a[j]){b[index++] = a[i++];}else{b[index++] = a[j++];ans += R1-i+1;//统计逆序对数 }} while(i<=R1) b[index++] = a[i++];while(j<=R2) b[index++] = a[j++];for(int i =0;i<index;i++){a[L1+i] = b[i];//合并后的数组赋值回去 }
}
void mergeSort(int l,int r){if(l == r) return;int mid = (l+r)/2;mergeSort(l,mid);mergeSort(mid+1,r);merge(l,mid,mid+1,r);
}
int main(){scanf("%d",&n);for(int i =0;i<n;i++){scanf("%d",&a[i]);}mergeSort(0,n-1);printf("%lld\n",ans);return 0;
}
N诺刷题(基础算法)相关推荐
- php算法在线刷题,c,算法_每日一道算法:leetcode 刷题碰到的问题。,c,算法 - phpStudy...
每日一道算法:leetcode 刷题碰到的问题. 这是题目: Given an unsorted array nums, reorder it such that nums[0] < nums[ ...
- C#LeetCode刷题-贪心算法
贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配 17.8% 困难 45 跳跃游戏 II 25.5% 困难 55 跳跃游戏 30.6% 中等 122 买卖股票的最佳时机 II C#LeetC ...
- C#LeetCode刷题-回溯算法
回溯算法篇 # 题名 刷题 通过率 难度 10 正则表达式匹配 18.8% 困难 17 电话号码的字母组合 43.8% 中等 22 括号生成 64.9% 中等 37 解数独 45.8% 困难 39 组 ...
- C#LeetCode刷题-分治算法
分治算法篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...
- 每天Leetcode 刷题 初级算法篇-打乱数组
目录 Leetcode刷题 Leetcode刷题 /*** @program: mydemo* @description: 设计问题-打乱数组* @author: Mr.zeng* @create: ...
- N诺刷题——字符串、排序、查找、链表
字符串类问题 1014加密算法 简单,过 1012字符移动 原做法 借助了两个字符串 #include<iostream> #include <string> #include ...
- leetcode 14天刷题计划-算法入门(共计31题)
文章目录 总结 2021.08.03(第1 天)二分 [1 704. 二分查找](https://leetcode-cn.com/problems/binary-search/) [2 278. 第一 ...
- [算法]力扣刷题-初级算法 - 数组(三)(数组篇完结) [两数之和] [有效的数独] [旋转图像]
初级算法 - 数组篇完结: 初级算法 - 数组(一): https://blog.csdn.net/weixin_43854928/article/details/121315702 初级算法 - 数 ...
- 刷题常用算法模板(持续更新)
目录 1.二分查找 2.线段树 3.树状数组 4.差分数组 5.前缀树 6.并查集 7.AC自动机 8.Morris遍历 9.二叉树非递归遍历 10.KMP 11.Manacher 12.快速选择 b ...
最新文章
- 測试人员的核心能力与素养
- keras lstm 层理解
- Vue2.0 UI框架Element运用之DateTimePicker(el-date-picker)初始值及时间格式转化等细节问题
- 轻松看懂机器学习十大常用算法 - 基础知识
- flask+uwsgi+supervisor+nginx在局域网服务器上部署实践
- 【BZOJ】2599: [IOI2011]Race 点分治
- java生成KML文件
- 移动支付走入线下商家
- 关于图片或者文件在数据库的存储方式归纳
- Python 基础变量声明
- 计算机专业专硕考研数学考一还是二,计算机专业考研数学考一还是二
- 李一男起伏人生如高速过山车 栽大跟头后还回得来吗
- 【开发经验】springboot配置文件加密详解
- 猴子吃桃问题(记录自己的学习)
- 如何实现点击按钮实现QQ在线联系客服聊天
- uva 1471 Defense Lines (降低复杂度)
- mac删除core文件并关闭core文件以节约磁盘
- 新生儿办理户口(入户)
- 计算机文化基础试题集:
- 易语言HTTP读文件
热门文章
- Servlet API中forward()与redirect()的区别?
- 《财务自由之路》的读书笔记总结4500字
- 一个初级前端结合css、div谈一谈屏幕尺寸、分辨率、缩放概念题
- SAP SD 基础知识之计划行类别(Schedule Line Category)
- 计算组合数c语言ac,AC排列组合
- c++程序员 常用工具集
- Python 自动化教程(1) 概述,第一篇 Excel自动化首篇
- python求解拉普拉斯矩阵
- linux php直接输出,linux学习之shell脚本 ------- 输入与输出
- FastFormers 论文解读:可以使Transformer 在CPU上的推理速度提高233倍