Codeforces Div.2 212 C Insertion Sort (DP)

U8采购入库单CO接口开发实战:加载、新增与删除操作详解 本文详细解析了用友U8采购入库单CO接口的开发实战,重点介绍了加载、新增与删除三大核心操作的实现方法。通过C#代码示例和实际项目经验,帮助开发者高效处理采购入库单,提升企业供应链管理效率。文章还涵盖了环境配置、异常处理、性能优化等关键技巧,适合U8二次开发人员参考。 阅读详情

超级传送门:http://codeforces.com/contest/362/problem/C


这是一道以插入排序(Insertion Sort)为基础的动态规划题目,不熟悉插入排序请参考维基百科插入排序

题目中给的插入排序代码如下所示:

for (int i = 1; i < n; i = i + 1)
{
   int j = i; 
   while (j > 0 && a[j] < a[j - 1])
   {
      swap(a[j], a[j - 1]); // swap elements a[j] and a[j - 1]
      j = j - 1;
   }
}

略去吐槽若干字。

题目输入一个0~n-1的无序排列,要求我们交换其某两个元素之后,再将新的无序排列采用上述插入排序时swap的调用次数最少,并求出可以达到同样效果(同样最少调用次数)的初始交换元素对的个数。

比如:

4 0 3 1 2
原本需要6次swap调用。

交换4和1后,得到:

1 0 3 4 2
只需要3次swap调用。

同样交换4和2也可以产生3次swap调用的序列。

所以得到答案(最少需要3次swap调用,有2种初始交换方案):

3 2


设原数组为a,设dp[i][j]为a[0]~a[i]中小于j的个数,则:

dp[0][j] = 0 (0 <= j < n),

dp[i][j] = dp[i-1][j] + (a[i] < j ? 1 : 0)

原序列所需要的swap调用次数old = Sigma(i - dp[i][a[i]]) (1 <= i < n)

若交换a[i]和a[j]( a[i] > a[j]时交换才有意义),我们作如下分析:

1. a[i]之前的元素(a[0] ~ a[i-1])的swap调用次数不会变;

2. a[j]之后的元素(a[j+1] ~ a[n-1])的swap调用次数不会变;

3. a[i]和a[j]之间的元素(a[i+1] ~ a[j-1])的swap调用次数会发生改变,变化量为-p+q(p为a[i+1]~a[j-1]中小于a[i]的元素个数,q为a[i+1]~a[j-1]中小于a[j]的元素个数)

4. a[i]处的swap调用次数会发生改变(从i位置挪到j位置),变化量为(j-i+1)-p

5. a[j]处的swap调用次数会发生改变(从j位置挪到i位置),变化量为-((j-i+1)-q)-1
故new = old-p+q+(j-i+1)-p-((j-i+1)-q)-1 
= old-2*(p-q)-1

其中p = dp[j - 1][a[i]] - dp[i][a[i]], q = dp[j - 1][a[j]] - dp[i][a[j]]


代码如下:

#include <stdio.h>

using namespace std;

int dp[5005][5005];
int a[5005];

int main()
{
	int n;
	while (scanf("%d", &n) > 0 && n)
	{
		int old = 0;
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &a[i]);
		}
		for (int j = 0; j < n; j++)
		{
			dp[0][j] = a[0] < j ? 1 : 0;
		}
		for (int i = 1; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				dp[i][j] = dp[i - 1][j] + (a[i] < j ? 1 : 0);
			}
			old += i - dp[i][a[i]];
		}
		int min = old;
		for (int i = 0; i < n; i++)
		{
			for (int j = i + 1; j < n; j++)
			{
				if (a[i] > a[j])
				{
					int p = dp[j - 1][a[i]] - dp[i][a[i]];
					int q = dp[j - 1][a[j]] - dp[i][a[j]];
					int tmp = old - 2 * (p - q) - 1;
					min = min < tmp ? min : tmp;
				}
			}
		}
		int ans = 0;
		for (int i = 0; i < n; i++)
		{
			for (int j = i + 1; j < n; j++)
			{
				if (a[i] > a[j])
				{
					int p = dp[j - 1][a[i]] - dp[i][a[i]];
					int q = dp[j - 1][a[j]] - dp[i][a[j]];
					int tmp = old - 2 * (p - q) - 1;
					if (tmp == min)
					{
						ans++;
					}
				}
			}
		}
		printf("%d %d\n", min, ans);
	}
	return 0;
}


计算机组成原理(第三版)唐朔飞-第四章存储器-课后习题 阅读详情

相关推荐

从查表法到实时计算:SimpleFOC库中正弦函数优化的技术演进

本文深入探讨了SimpleFOC库v2.0.1版本中正弦函数优化技术的演进,从传统查表法到实时计算的创新实践。通过定点数优化、对称性利用和分段线性插值等关键技术,实现了在嵌入式电机控制中的高效三角函数计算,显著提升性能和资源利用率。

weixin_28273593的博客 452

CodeForces 212C

dp dp[i][0]表示第i号位置没有变动,dp[i][i]表示变动#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int N=220; char ss[N]; typedef __int64 LL; LL dp[N][2]; LL cal(int a,int b){ int

wen_xp的专栏 447

一文搞懂 RC Correlation Scale Factor 的生成与应用

pre-route 用的是统计估算模型,post-route 用的是详细布线提取,signoff 用的是第三方 QRC 或 StarRC——三个工具,三套参数体系,结果自然天差地别。不同 RC corner(rc_worst/rc_best/rc_typical)对应不同的工艺角和温度环境,每个 corner 的 R/C 偏差比例不同,必须分别生成和应用各自的 scale factor。别被名字骗了,这个工具专门干一件事——统计拟合两组 SPEF 之间的偏差,自动推荐最优 scaling factor。

weixin_47770727的博客 557

codeforces 212 C DP 递推 计数 破环

http://www.codeforces.com/problemset/problem/212/C 不错的一个DP题,重在思维。(YY了大神的代码良久) 题意:给你一串由A 和 B组成的字符串,首尾是相连的,组成一个环 有个规则就是AB 会 变成BA,然后问你有多少个串可以一步变成给你的串 比如 BAA 答案是1,只有ABA一个串可以变成BAA 讲一下解法吧,首先,环状的东东

努力奋斗才能梦想成真 1628

Flowable多数据源实战:从配置到指定Schema的避坑指南

本文详细介绍了Flowable多数据源配置的实战指南,包括基础配置、数据源Bean创建、指定Schema的进阶配置以及常见问题排查。通过具体代码示例和避坑建议,帮助开发者高效实现多租户系统中的工作流引擎集成,特别强调了schema设置和事务管理的注意事项。

weixin_30824599的博客 486

GEO芯片数据下载和探针ID转换(保姆级教程)

R语言安装、GEO芯片数据下载、探针ID转换

qq_43138237的博客 3万+

Codeforces Round #212 (Div. 2) C

// 预处理出所有数在这个序列内和1...n的大小关系的前缀和 #include #include #include using namespace std; int n,a[5005],dp[5005][5005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i

a542676815的专栏 831

山东大学机器学习(实验一内容)——线性回归

1. 描述 第一个练习将为你提供线性回归练习。这些练习已经用Matlab进行了广泛的测试,但它们也应该在Octave中工作,它被称为“免费版的Matlab”。如果你使用的是Octave,那就是 一定要安装Image包(可在Windows中作为选项使用)安装程序,可从Octave-Forge获得Linux。 2.线性回归 回想一下,线性回归模型是 hθ(x)=θTx=∑j=0nθjxj h_{\th...

HachiLin的博客 4108

CodeForces 212D

线段树 对于每个数字,分别处理更新 区间修改+等差数列#include<cstdio> #include<iostream> #include<cstring> using namespace std; const int N=1e6+100; typedef __int64 LL; LL add[N<<2],st[N<<2],cha[N<<2]; #define ll o<<1 #define

wen_xp的专栏 463

阿里云百炼平台创建智能体-上传文档

阿里云百炼智能体-上传文档文件

weixin_43930851的博客 1356

Java调用YOLOv26全解析:从ONNX模型部署到工业质检实战

本文分享了工业自动化领域使用Java调用YOLOv26进行零件缺陷检测的完整方案。通过YOLOv26s模型结合ONNX Runtime Java部署,误检率和漏检率显著降低(分别从12%降至2.1%,8%降至0.8%)。文章详细介绍了方案选型理由、环境配置避坑指南、ONNX模型导出步骤,以及Maven依赖配置(分CPU/GPU版本)。该方案直接在上位机Java环境中运行,避免了跨语言调用损耗,适合工业质检场景部署,提供了可复用的性能优化和多线程推理实现。

2601_94871597的博客 1108

Codeforces Round #212 (Div. 2) C. Insertion Sort 思维

传送门 文章目录题意:思路: 题意: n≤5000n\le5000n≤5000 思路: 从dpdpdp题集中看到的,一看n≤5000n\le5000n≤5000,这不就乱搞就行了,哪有什么dpdpdp????。 看到冒泡排序,一般跟逆序对脱不了关系了,所以定义change[i][j]change[i][j]change[i][j]表示将iii放到jjj位置的时候逆序对变化数量,这个可以O(n2)O(n^2)O(n2)预处理出来,让后n2n^2n2枚举i,ji,ji,j计算答案就行了。 // Problem

m0_51068403的博客 172

Keras深度学习实战(32)——基于LSTM预测股价

股价预测是时间序列预测中最具挑战性的问题之一,研究股价预测问题具有重要的理论意义和应用价值。针对循环神经网络在股价预测中存在的长期依赖等缺点,本文引入了长短时记忆神经网络以提高股价预测的效果。同时,我们把有关公司的新闻标题的文本数据作为模型的输入变量时,发现预测效果更好,因此我们可以把有关公司的新闻标题的文本数据作为一个有效的输入变量。最后,通过利用 Keras 实现了以上两个股价预测模型,并进行了性能分析和对比。

盼小辉丶的博客 1万+

Codeforces Round #212 (Div. 2) C. Insertion Sort

这道题的题意是给你一个数字n然后再给你n个数字,他们都是0-n-1的数字。求这n个数字,再交换任意两个数字之后再进行冒泡排序需要交换数字的次数。 首先肯定不是暴力、、、一开始没做出来,是鹏哥教的我、、、、太笨了啊,不解释啊、、、 大家还是看他的吧、、、http://blog.csdn.net/rowanhaoa/article/details/16341489 C. Insertio

I am a slow walker, but I never walk backwards! 1507

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Codeforces-984D - XOR-pyramid - 思维

题解链接: https://lucien.ink/archives/212/ 题目链接: http://codeforces.com/contest/984/problem/D 题目: For an array bbb of length mmm we define the function fff as f(b){b[1],f(b[1]⊕b[2],b[2]⊕b[3],…,b[...

LucienShui 1156

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

百度2012年校招笔试题——pszStringRotate

百度2013校园招聘笔试题 算法与程序设计 第4题:          字符串左移,void *pszStringRotate(char *pszString, int nCharsRotate),比如ABCDEFG,移3位变DEFGABC,要求空间复杂度O(1),时间复杂度O(n)。         字符串位移,再简单不过了,方法也很多. 有朴素算法(逐位移动,移动nCharsRotat

Uranux 3073

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Project Euler 26 Reciprocal cycles(计算有理小数循环节长度)

超级传送门:http://projecteuler.net/problem=26 算法的核心思想:在除法过程中如果某一状态的除数与被除数和前面某一状态的相等,则后续的除法计算陷入循环,循环节长度就是这两个状态的距离。 例子:计算1/7的循环节长度 状态1: 10/7  得1余3 状态2: 30/7  得4余2 状态3: 20/7  得2余6 状态4: 60/7  得8余4 状

Uranux 1639

HDOJ 2852 KiKi's K-Number(树状数组)

超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2852 题意:有一个容器里有m个数(1 分析:用树状数组来维护这个容器,每次查找用二分。 代码: #include #include using namespace std; const int maxn = 100010; int c[maxn]; int n; in

Uranux 1600

POJ 2185 Milking Grid(二维KMP)

超级传送门:http://poj.org/problem?id=2185 这道题网上很多其他的blog上的题解都是错的,由于题目自身数据比较水,便都混过去了。其中一种典型的错误解法是求出每一行/列的最小覆盖长度(ABCAB的最小覆盖长度就是3,即对应ABC),然后LCM,若结果大于串长,则取串长。这是一种典型的错误贪心,诸如: 2 8 ABCDEFAB AAAABAAA 这组数据

Uranux 1232

ZOJ 3430 Detect the Virus(AC自动机+解码)

超级传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3430 本题思路清晰,不过解码确实繁琐,看来自己代码能力还有待加强。 需要注意几个点:解码后的ASCII字符的范围是0~255,而且可能包含'\0',不能用char来存,最好用int。 代码: #include #include #

Uranux 1096

Project Euler 51 Prime digit replacements(枚举)

超级传送门:http://projecteuler.net/problem=51   这题我是暴力枚举的,O3优化后2秒多。 先枚举素数,再枚举要替换的位置,我用二进制来表述,设dc为当前枚举到素数的位数,则替换方法可以从1 ~ (1   代码如下:   #include #include #include using namespace std; int p

Uranux 1086

Project Euler 13 Large sum(大数加法)

超级传送门:http://projecteuler.net/problem=13 自己写的大数加法模板,用的时候注意设定tmp数组适当的长度,避免溢出或浪费空间。 #include #include using namespace std; char num[150][51] = { "3710728753390210279879799822083759024651

Uranux 1077

Codeforces Div.2 213 C Matrix (预处理+哈希)

超级传送门:http://codeforces.com/contest/365/problem/C 这场特别遗憾,A题题意看错WA了2次,C题溢出导致没能通过系统测试,如果C题过了就能排前30。 题意是给你一个长度不超过4000的数字s,定义b[i][j]=s[i]*s[j],则可以得到一个矩阵b;又给你一个数a,求b有多少个子矩阵其和为a。 例如: 10 12345 a=10,

Uranux 1036

HDOJ 2054 A == B ?

超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2054 这道题坑特别多: 放几组数据: // 均为YES 0.0 0.00 -0 0 -0. +.0 0.1 00.10 4 4 +1 1 -1 -1.0 1.0 1.0 +.020 00.02 代码如下(主要练习string的iterator): #include #i

Uranux 929

HDOJ 1425 sort

超级传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1425 此题的特点:数据量大,但是数据的范围不大。用hash就行,hash函数就是减500000 #include int hash[1000100]={0}; int main () { int n,m,i,a,count,max,first; while (sc

Uranux 926

Project Euler 54 Poker hands(模拟+hash)

超级传送门:http://projecteuler.net/problem=54   刚看到题目描述,就联想到天津Regional的A题麻将那题,可惜没能AC,遗憾了好久。 这题比麻将那题要简单一些,规则描述比较清楚,要比较两手梭哈牌的大小,我用了hash来存牌,定义了各种判定判断函数来进行判断。 代码量还是比较大的,差不多600行,写的过程中很容易错。Unix/Linux设计思想——小即

Uranux 886
上一篇: HDOJ 3183 A Magic Lamp
下一篇: [VC++深入详解] 1. Windows程序内部运行机制
Uranux
博客等级 码龄15年 16粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值