题目一:错误票据
排序
输入样例
2
5 6 8 11 9
10 12 9
输出样例
7 9
vector容器使用:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int b[200000]={0};
int main()
{
vector <int> a;
int n,x;
cin>>n;
while(n--){
while(cin>>x){
a.push_back(x);
if(cin.get()=='\n')break;
}
}
sort(a.begin(),a.end());
int ans1,ans2;
for(int i=1;i<a.size();i++){
if(a[i]==a[i-1]+2)ans1=a[i]-1;
if(a[i]==a[i-1])ans2=a[i];
}
cout<<ans1<<" "<<ans2<<endl;
return 0;
}
题目二:分糖果
题目三:dfs练习——全排列
tip1 全排列
#include <iostream>
using namespace std;
int n;
int a[50]; //盒子,即排列每一次结果
bool vis[20]; //值为0表示没有用过,1表示用过
void dfs(int step){ //step表示在哪一个盒子面前
//递归边界
if(step==n+1){
//输出结果
for(int i=1;i<=n;i++){
printf("%5d",a[i]);
}
cout<<endl;
return;
}
//递归关系式
for(int i=1;i<=n;i++){ //遍历每一个数字,即该数字是否可用
if(vis[i]==0){ //i 没有用过
a[step]=i; // 将i存入数组a[]
vis[i]= true; //标记i已经用过
dfs(step+1); //移到下一个位置
vis[i]= false; //标记i未用过
}
}
}
int main()
{
cin>>n;
dfs(1);
return 0;
}
tip2 n取r个全排列
输入一个数字n表示1~n这n个数字,里面取r个进行全排列
#include <iostream>
using namespace std;
int n,r,a[100];
bool b[100];
void print(){
for(int i=1;i<=r;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
void dfs(int p){
// 循环
for(int i=1;i<=n;i++){
//该位置可用
if(!b[i]){
a[p]=i;
b[i]= true;
// 截止
if(p==r) print();
else dfs(p+1);
b[i]= false;
}
}
}
int main() {
cin>>n>>r;
dfs(1);
return 0;
}
tip3 电话号码的自由组合
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = "" 输出:[]
示例 3:
输入:digits = "2" 输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。#include <iostream> #include <vector> #include <string> using namespace std; const vector<string> Map = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; vector<string> result; //存储最终结果 string s; //当前结果 //dfs回溯 void dfs(const string& num, int index) { // 终止条件 if (index == num.size()) { result.push_back(s); return; } // 循环结果 int a = num[index]-'0'; //将index指向的数字转化为int(比如,2,3) string b = Map[a]; //取出对应可选择的字符集 for(int i=0;i<b.size();i++){ s.push_back(b[i]); //将字符加入结果中 dfs(num,index+1); //递归调用dfs函数,将 index 增加 1,以处理下一个数字。 s.pop_back(); //递归结束后,执行回溯操作,将 s 的最后一个字符移除,以便处理下一个字符的组合 } } int main() { string num; cin>>num; //输入为空处理 if (!num.length()) return 0; //否则进行处理 dfs(num, 0); for (const string& ans : result) { cout << ans << " "; } cout << endl; return 0; }
tip4 素数环
输入一个数字n表示1~n这n个数字,相邻两个数之和为素数,而环就是第一个与最后一个数之和为素数。满足条件的方案有多少个?
与tip1不同是排列要求相邻之和为素数
#include <iostream>
#include <cmath>
using namespace std;
int n,r,a[100],ans=0;
bool b[100];
//打印
void print(){
for(int i=1;i<=n;i++){
cout<<