目录

  • 玛雅人的秘密
  • 逆序对

玛雅人的秘密

玛雅人有一种密码,如果字符串中出现连续的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诺刷题(基础算法)相关推荐

  1. php算法在线刷题,c,算法_每日一道算法:leetcode 刷题碰到的问题。,c,算法 - phpStudy...

    每日一道算法:leetcode 刷题碰到的问题. 这是题目: Given an unsorted array nums, reorder it such that nums[0] < nums[ ...

  2. C#LeetCode刷题-贪心算法

    贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配 17.8% 困难 45 跳跃游戏 II 25.5% 困难 55 跳跃游戏 30.6% 中等 122 买卖股票的最佳时机 II C#LeetC ...

  3. C#LeetCode刷题-回溯算法

    回溯算法篇 # 题名 刷题 通过率 难度 10 正则表达式匹配 18.8% 困难 17 电话号码的字母组合 43.8% 中等 22 括号生成 64.9% 中等 37 解数独 45.8% 困难 39 组 ...

  4. C#LeetCode刷题-分治算法

    分治算法篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...

  5. 每天Leetcode 刷题 初级算法篇-打乱数组

    目录 Leetcode刷题 Leetcode刷题 /*** @program: mydemo* @description: 设计问题-打乱数组* @author: Mr.zeng* @create: ...

  6. N诺刷题——字符串、排序、查找、链表

    字符串类问题 1014加密算法 简单,过 1012字符移动 原做法 借助了两个字符串 #include<iostream> #include <string> #include ...

  7. leetcode 14天刷题计划-算法入门(共计31题)

    文章目录 总结 2021.08.03(第1 天)二分 [1 704. 二分查找](https://leetcode-cn.com/problems/binary-search/) [2 278. 第一 ...

  8. [算法]力扣刷题-初级算法 - 数组(三)(数组篇完结) [两数之和] [有效的数独] [旋转图像]

    初级算法 - 数组篇完结: 初级算法 - 数组(一): https://blog.csdn.net/weixin_43854928/article/details/121315702 初级算法 - 数 ...

  9. 刷题常用算法模板(持续更新)

    目录 1.二分查找 2.线段树 3.树状数组 4.差分数组 5.前缀树 6.并查集 7.AC自动机 8.Morris遍历 9.二叉树非递归遍历 10.KMP 11.Manacher 12.快速选择 b ...

最新文章

  1. 測试人员的核心能力与素养
  2. keras lstm 层理解
  3. Vue2.0 UI框架Element运用之DateTimePicker(el-date-picker)初始值及时间格式转化等细节问题
  4. 轻松看懂机器学习十大常用算法 - 基础知识
  5. flask+uwsgi+supervisor+nginx在局域网服务器上部署实践
  6. 【BZOJ】2599: [IOI2011]Race 点分治
  7. java生成KML文件
  8. 移动支付走入线下商家
  9. 关于图片或者文件在数据库的存储方式归纳
  10. Python 基础变量声明
  11. 计算机专业专硕考研数学考一还是二,计算机专业考研数学考一还是二
  12. 李一男起伏人生如高速过山车 栽大跟头后还回得来吗
  13. 【开发经验】springboot配置文件加密详解
  14. 猴子吃桃问题(记录自己的学习)
  15. 如何实现点击按钮实现QQ在线联系客服聊天
  16. uva 1471 Defense Lines (降低复杂度)
  17. mac删除core文件并关闭core文件以节约磁盘
  18. 新生儿办理户口(入户)
  19. 计算机文化基础试题集:
  20. 易语言HTTP读文件

热门文章

  1. Servlet API中forward()与redirect()的区别?
  2. 《财务自由之路》的读书笔记总结4500字
  3. 一个初级前端结合css、div谈一谈屏幕尺寸、分辨率、缩放概念题
  4. SAP SD 基础知识之计划行类别(Schedule Line Category)
  5. 计算组合数c语言ac,AC排列组合
  6. c++程序员 常用工具集
  7. Python 自动化教程(1) 概述,第一篇 Excel自动化首篇
  8. python求解拉普拉斯矩阵
  9. linux php直接输出,linux学习之shell脚本 ------- 输入与输出
  10. FastFormers 论文解读:可以使Transformer 在CPU上的推理速度提高233倍