爱丽丝的人偶
爱丽丝有n n\ n 个人偶,每个人偶的身高依次是1、2、3……n 1、2、3……n\ 1、2、3……n
现在她要将这n n\ n 个人偶摆成一排。
但是人偶被设置了魔法。假设对一个非两端的(不在队首也不在队尾)人偶x x\ x 而言,她相邻的两个人偶,一个比x x\ x 高、一个比x x\ x 矮,那么x x\ x 就会爆炸。
爱丽丝想找到一种摆法,使得所有人偶都不会爆炸。你能帮帮她吗?
输入描述:
一个正整数n n\ n (3≤n≤100000) (3≤n≤100000)\ (3≤n≤100000)
输出描述:
满足要求的一种摆法。如果有多解,输出任意一种摆法即可。
非常简单,想到啥就去做就行了
#include <iostream>
#include <vector>
using namespace std;
int n;
int main()
{
cin>>n;
vector<int>ans(n);
for(int i = 0;i<n;++i)ans[i] = i+1;
for(int i = 1;i<n;i+=2)
{
swap(ans[i],ans[i-1]);
}
for(int i = 0;i<n;++i)
cout<<ans[i]<<" ";
return 0;
}
集合
给你两个集合,要求{A} + {B}。 注:同一个集合中不会有两个相同的元素。
输出时按数字升序输出。
数据范围: 1≤�,�≤10000 1≤n,m≤10000 ,集合中的元素满足 1≤���≤105 1≤val≤105
输入描述:
每组输入数据分为三行,第一行有两个数字n,m,分别表示集合A和集合B的元素个数。后两行分别表示集合A和集合B。每个元素为不超过int范围的整数,每个元素之间有个空格隔开。
输出描述:
针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开,行末无空格。
归并排序的思想,直接上手去干就完了
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n,m;
vector<int>a,b;
int main() {
cin>>n>>m;
for(int i = 0;i<n;++i)
{
int x;
cin>>x;
a.emplace_back(x);
}
for(int i = 0;i<m;++i)
{
int x;
cin>>x;
b.emplace_back(x);
}
sort(a.begin(),a.end());
sort(b.begin(),b.end());
int i = 0,j = 0;
while(i<n&&j<m)
{
if(a[i]<b[j]){
cout<<a[i++]<<' ';
}
else if(a[i]>b[j])cout<<b[j++]<<' ';
else{
cout<<a[i++]<<' ';
++j;
while(i<n&&a[i]==a[i-1])i++;
while(j<m&&b[j] == b[j-1])++j;
}
}
while(i<n)cout<<a[i++]<<' ';
while(j<m)cout<<b[j++]<<' ';
return 0;
}
// 64 位输出请用 printf("%lld")
最长回文子序列
给定一个字符串,找到其中最长的回文子序列,并返回该序列的长度。
注:回文序列是指这个序列无论从左读还是从右读都是一样的。
本题中子序列字符串任意位置删除k(len(s)>=k>=0)个字符后留下的子串。
数据范围:字符串长度满足 1≤�≤10001≤n≤1000
进阶:空间复杂度 �(�2)O(n2) , 时间复杂度 �(�2)O(n2)
输入描述:
输入一个字符串
输出描述:
输出最长回文子序列
#include <iostream>
using namespace std;
string s;
int n;
const int N = 1010;
int dp[N][N];//dp[i][j]表示的是[i,j]区间内,最长回文子序列的长度是多少
int main()
{
cin>>s;
//动态规划--区间DP问题
n = s.size();
for(int i = n-1;i>=0;--i)
{
for(int j = i;j<n;++j)
{
if(i==j)dp[i][j] = 1;
else{
if(s[i] == s[j])dp[i][j] = dp[i+1][j-1]+2;
else dp[i][j] = max(dp[i+1][j],dp[i][j-1]);
}
}
}
cout<<dp[0][n-1]<<'\n';
return 0;
}