题目

小b有两个长度都为n的序列A,B。

现在她需要选择一些i,然后交换A[i]和B[i],使得A和B都变成严格递增的序列。

你能帮小b求出最少交换次数吗?

输入保证有解。

输入

第一行输入一个正整数n,表示两个数组的长度;
第二行输入n个数,表示A[i],以空格隔开;
第三行输入n个数,表示B[i],以空格隔开;
其中1≤n≤1000, 0≤A[i],B[i]≤2000

输出

输出一个数,表示交换次数

输入样例

4
1 3 5 4
1 2 3 7

输出样例

1

思路:

设 dp[i][0] 表示没有交换的次数,dp[i][1] 表示交换的次数

那么,当两个序列中的第 i 个数都比第 i-1 个数大,有:

  • dp[i][0]=min(dp[i][0],dp[i-1][0])
  • dp[i][1]=min(dp[i][1],dp[i-1][1]+1)

当序列 a 的第 i 个数大于序列 b 的第 i-1 个数且序列 b 的第 i 个数大于序列 a 的第 i-1 个数,有:

  • dp[i][0]=min(dp[i][0],dp[i-1][1])
  • dp[i][1]=min(dp[i][1],dp[i-1][0]+1)

源程序

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 1000000+5;
const int dx[] = {0,0,-1,1,-1,-1,1,1};
const int dy[] = {-1,1,0,0,-1,1,-1,1};
using namespace std;int a[N],b[N];
int dp[N][2];//dp[i][0]表示没有交换的次数,dp[i][1]表示交换的次数
int main() {int n;scanf("%d",&n);for(int i=1; i<=n; i++)scanf("%d",&a[i]);for(int i=1; i<=n; i++)scanf("%d",&b[i]);memset(dp,INF,sizeof(dp));a[0]=b[0]=-1;dp[0][0]=dp[0][1]=0;for(int i=1; i<=n; i++) {if(a[i]>a[i-1]&&b[i]>b[i-1]) {//若两个序列中的第i个数都比第i-1个数大dp[i][0]=min(dp[i][0],dp[i-1][0]);dp[i][1]=min(dp[i][1],dp[i-1][1]+1);}if(a[i]>b[i-1]&&b[i]>a[i-1]) {//若序列a的第i个数大于序列b的第i-1个数且序列b的第i个数大于序列a的第i-1个数dp[i][0]=min(dp[i][0],dp[i-1][1]);dp[i][1]=min(dp[i][1],dp[i-1][0]+1);}}cout<<min(dp[n][0],dp[n][1])<<endl;return 0;
}

小b和排序(51Nod-2484)相关推荐

  1. c语言中输入大数,如何使用C语言实现输入10个数按从大到小的顺序排序输出

    本文主要向大家介绍了如何使用C语言实现输入10个数按从大到小的顺序排序输出,通过具体的内容向大家展示,希望对大家学习C语言有所帮助. 用选择排序法编写c语言,实现从键盘上输入10个数,按从大到小的顺序 ...

  2. 2022-6-5 括号之价,最长配对,梦中岛之路,小Biu的旅行,最小正子段和,小b和排序,顺子,重排列得到2的幂,重排列,和为K的倍数,低买高卖,小b删列

    1. 括号之价 [栈] 小Y上数据结构课的时候摸鱼,听到老师在讲用栈做括号匹配,于是乎边随意写了一个合法的括号序列.但是光是写括号太无聊了,他现在想知道这个括号序列的价值.他是这样定义一个括号序列的价 ...

  3. 微信小程序数据排序和倒序reverse()

    var a = [3,7,2]; 微信小程序数据排序,先将数据按从小到大排序 //定义compare函数,参数name是对象的某一个属性,比如age.salary //返回一个可以用来对包含该成员的对 ...

  4. 将给定的整数进行由小至大排序

    任务描述 本关任务:补充程序中的代码,将给定的的三个整数进行由小至大排序. 编程要求 根据提示,在Begin-End中代码完善,将排序完成之后的结果输出即可. 测试输入: int x = 9; int ...

  5. 小福利,排序不等式和切比雪夫不等式,平方和不等式的运用

    小福利,排序不等式和切比雪夫不等式,平方和不等式的运用 除了上面的直接证明法外,我们用excel做了一个数据验证 分别取a,b,c三个大于0小于1的正实数,可以用函数来设定数据 =RANDBETWEE ...

  6. java集合数组,数组小到大排序,数组大到小排序

    List<?>[] lsa = new List<?>[10]; // OK, array of unbounded wildcard type. Object o = lsa ...

  7. mysql通过订单量排序_mysql-关于PHP中订单按照从大到小的顺序排序的思路.

    现在我的需求是这样的, 每一个用户会产生 N 多订单 现在要排序 订单数量从大到小 的用户. 如果按照传统 我先将每一个用户的订单总数统计,然后进行排序.这样一但数据量变大基本无法排序会很消耗系统资源 ...

  8. python选择排序从大到小_经典排序算法和Python详解之(一)选择排序和二元选择排序...

    本文源自微信公众号[Python编程和深度学习]原文链接:经典排序算法和Python详解之(一)选择排序和二元选择排序,欢迎扫码关注鸭! 扫它!扫它!扫它 排序算法是<数据结构与算法>中最 ...

  9. php选择排序从大到小,PHP选择排序

    选择排序大约和冒泡排序一样简单了吧 , 不过它的效率要比冒泡排序好很多 , 冒泡排序作为公认最慢的排序算法 ... 这个已经无疑问了 - - ... 选择排序非常简单的代码 : // 交换 funct ...

最新文章

  1. mendeley 多PC同步
  2. spring-cloud-eureka服务注册与发现
  3. python封装c++接口_使用MetaSIP自动生成SIP封装C++到Python接口
  4. 漫画 | 你真的会用烙铁焊接吗?
  5. Metasploit渗透测试框架
  6. 我php第一个页面,PHP 第一个 PHP 页面 - 第一个 PHP 页面 - phpStudy
  7. 微博抽奖贴为什么到时间了不开奖_热搜第一!微博闹剧,锦鲤“信小呆”被这样处罚...
  8. 移动站适配rel=alternate PC页和H5页适配标注
  9. 洛谷 P1631 序列合并
  10. Pthon入门--range()函数
  11. 技术圈几个牛逼的公号推荐给大家
  12. 系统找不到指定的文件。 : No installed service named Apache
  13. 令牌桶 java_服务限流(自定义注解令牌桶算法)
  14. python 安全编码代码审计
  15. 计算机efs加密,我的电脑文件efs加密了,现在从做系统打不开了怎么处理啊
  16. android 自定义locale,android – 以编程方式设置Locale
  17. 关于某课堂的视频文件ts文件下载——m3u8加密问题
  18. PDF文件如何导出成图片,PDF如何转换成图片
  19. 橙子钱包app是谁做的?
  20. 家用wifi能查到浏览记录吗_2020最好用的行车记录仪推荐

热门文章

  1. 线程池,远没你想象的那么简单
  2. JimuReport积木报表——如何设计一张带二维码的打印报表?
  3. oracle 层次查询判断叶子和根节点
  4. 数据产品-指标体系和埋点设计
  5. 助AI研究社群发出内建18种预先训练模型工具
  6. 第六章 图 学习小结
  7. 微信小游戏的前端攻城狮玩法
  8. 《玩转掌上生活——手机网上生活达人秘笈》一1.2 迎接掌上生活
  9. PL/Sql 中创建、调试、调用存储过程
  10. 提升业务价值 APM应用与整合分享