One Day

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≤in)。

输出格式

输出一个整数,表示最大连续子序列和。

样例输入

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的调试过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值