博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[题解]火柴排队
阅读量:5148 次
发布时间:2019-06-13

本文共 1022 字,大约阅读时间需要 3 分钟。

题目

解法

这道题实际上是一类问题:给你两个序列 \(a(n) b(n)\),问最少花费几步可以将\(a(n)\)变成\(b(n)\)。

如何做这种问题呢?

我们考虑这个步数要最小实际上是什么,就是讲优先级一样的放在两个序列的相同位置,并且尽量让每一个数移动的位置最少。

所以我们需要将\(a(n) 和 b(n)\)按照优先级排序。

那排序后又怎么做呢?

我们考虑构建一个新的数组 \(c(n)\),其中 \( c[a[i],id] = b[i].id \)。

然后要让 \(a(n)=b(n)\) 实际上就是要让\(c[i]=i\) 也就是要让b数组中第i个数和a数组中第i个数在同一个位置。

那么这就转化成了求解逆序对的数量了。

代码

#include 
#include
#include
#include
#include
#include
#include
#include
#define INF 2139062143#define MAX 0x7ffffffffffffff#define del(a,b) memset(a,b,sizeof(a))using namespace std;typedef long long ll;template
inline void read(T&x){ x=0;T k=1;char c=getchar(); while(!isdigit(c)){ if(c=='-')k=-1;c=getchar();} while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=k;}const int maxn=1e5+15;const int mod=99999997;int n;int temp[maxn];struct node { int h,id; bool operator < (const node& x) const { return h==x.h?id
View Code

 

转载于:https://www.cnblogs.com/mrasd/p/9911134.html

你可能感兴趣的文章
Java学习笔记--字符串和文件IO
查看>>
转 Silverlight开发历程—(画刷与着色之线性渐变画刷)
查看>>
SQL语法(3)
查看>>
在js在添版本号
查看>>
sublime3
查看>>
Exception Type: IntegrityError 数据完整性错误
查看>>
Nuget:Newtonsoft.Json
查看>>
Hdu - 1002 - A + B Problem II
查看>>
每天CookBook之Python-003
查看>>
Android设置Gmail邮箱
查看>>
js编写时间选择框
查看>>
JIRA
查看>>
小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
查看>>
深浅拷贝(十四)
查看>>
HDU 6370(并查集)
查看>>
BZOJ 1207(dp)
查看>>
PE知识复习之PE的导入表
查看>>
HDU 2076 夹角有多大(题目已修改,注意读题)
查看>>
洛谷P3676 小清新数据结构题(动态点分治)
查看>>
九校联考-DL24凉心模拟Day2T1 锻造(forging)
查看>>