One day
1.贪心算法:
问题描述
小蓝被称之为数字王国的数学魔术家,他总是能将一个数字变换出不同的样子。
现在小蓝遇见了一个考验,给定一个整数 xx,小蓝可以从 xx 中任意选择两个数字并调换它们的位置,请问在保证变换后 xx 合法的情况下 xx 可以变成的最大值和最小值分别是多少?
比如数字 130130,可以变为 310310,但不能变为 013013,因为 00 开头的数字不合法。
操作可以进行无限次。
输入格式
输入一行一个整数 x(1≤x≤10100000)x(1≤x≤10100000)。
保证 xx 是个合法的整数。
输出格式
输出一行两个整数分别表示 xx 可以变成的最大值和最小值。
输入样例
1423
输出样例
4321 1234
代码实现:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
sort(s.begin(),s.end());
string t;
t= s;
reverse(t.begin(),t.end());
cout<<t<<" ";
int i=0;
while(s[i]=='0'){
i++;
}
swap(s[i],s[0]);
cout<<s;
return 0;
}
说明:
这里用到用到sort()函数让字符串从小到大进行排序,输出最大值是用revese()进行反转字符串,最后用一个while循环判段第一个字符是否为0;
2.动态规划
问题描述
给定一个序列 AA,请你输出序列 AA 的最大连续子序列和。连续子序列可以为空。
输入格式
第一行输入一个正整数 nn,表示序列长度。(1≤n≤105)(1≤n≤105)。
接下来一行输入 nn 个整数 AiA**i。(−104≤Ai≤104,1≤i≤n)(−104≤A**i≤104,1≤i≤n)。
输出格式
输出一个整数,表示最大连续子序列和。
样例输入
9 -2 1 -3 4 -1 2 1 -5 4
样例输出
6
说明
4,−1,2,1 是最大连续子序列。
代码实现:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[100010];
int n;
int sum=0;
int ans=0;
cin >>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
sum = max(sum+a[i],a[i]);
ans= max(ans,sum);
}
cout<<ans;
return 0;
}
说明:
运用max函数进行判断
3.递归实现排列型枚举
问题描述
把 1∼n1∼n 的 nn 个正整数排成一行后随机打乱顺序,按字典序输出所有不同的方案。
输入格式
输入一行,包含一个正整数 nn。(1≤n≤8)(1≤n≤8)
输出格式
输出 n!n! 行,每一行为一种方案。字典序较小的先输出。
样例输入
3
样例输出
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
代码实现:
#include<bits/stdc++.h>
using namespace std;
int main(){
int arr[10]= {1,2,3,4,5,6,7,8,9,10};
int n;
cin>>n;
for(int i=0;i<n;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
while(next_permutation(arr,arr+n)){
for(int i=0;i<n;i++){
cout<<arr[i]<<" ";
}
cout <<endl;
}
return 0;
}
说明:
C++ STL中的next_permutation函数,用于生成全排列。通过示例展示了如何使用该函数解决全排列问题和组合输出问题,简化了递归DFS的调试过程。