7-163 最接近神的人
破解了符文之语,小FF开启了通往地下的道路。当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案。而石门上方用古代文写着“神的殿堂”。小FF猜想里面应该就有王室的遗产了。但现在的问题是如何打开这扇门……
仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的。而最聪明的人往往通过一种仪式选拔出来。仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即交换序列中相邻的两个元素。而用最少的交换次数使原序列变成不下降序列的人即是下一任智者。
小FF发现门上同样有着n个数字。于是他认为打开这扇门的秘诀就是找到让这个序列变成不下降序列所需要的最小次数。但小FF不会……只好又找到了你,并答应事成之后与你三七分……
输入格式:
第一行为一个整数n,表示序列长度
第二行为n个整数,表示序列中每个元素。
输出格式:
一个整数ans,即最少操作次数。
输入样例:
4
2 8 0 3
输出样例:
3
说明/提示:
对于30的数据1≤n≤104。
对于100的数据1≤n≤5∗105;
−maxlongint≤A[i]≤maxlongint。
样例说明:开始序列为2803,目标序列为0238,可进行三次操作的目标序列:
1.Swap (8,0):2 0 8 3
2.Swap (2,0):0 2 8 3
3.Swap (8,3):0 2 3 8
代码:
void merge(int left, int right);
void MergeSort(int left, int right)
{
if (right - left + 1<2)
return;
int mid = (left + right) / 2;
MergeSort(left, mid);
MergeSort(mid + 1, right);
merge(left, right);
}
void merge(int left, int right)
{
int k = 0;
int mid = (left + right) / 2;
int i=left, j=mid+1;
while (i <= mid && j <= right) {
if (arr[i] >arr[j]) {
cnt += (mid - i + 1);
tmp[k++] = arr[j++];
}
else
tmp[k++] = arr[i++];
}
while (i <= mid)
tmp[k++] = arr[i++];
while (j <= right)
tmp[k++] = arr[j++];
for (int i = 0; i < k; i++)
arr[left + i] = tmp[i];//浼犲叆鍘熸暟缁?
}
int main()
{
int n;
cin >> n;
memset(arr, 0, sizeof(arr));
memset(tmp, 0, sizeof(tmp));
cnt = 0;
for (int i = 0; i < n; i++)
cin >> arr[i];
MergeSort(0, n - 1);
cout << cnt << endl;
}
7-164 稀疏矩阵的处理
特殊矩阵在采用二维数组存储时,尽管矩阵操作的算法都很简单,但是其空间的利用率很低。 稀疏矩阵就是一种应用很广泛的特殊的矩阵。通常稀疏矩阵在处理时都采用“压缩”存储,即把稀疏矩阵的非零元素抽象成为一个以三元组(行,列,值)为数据元素的线性表来处理,此线性表可以采用顺序存储,也可以采用链式存储。现要求编程实现稀疏矩阵在“压缩”存储时的常用操作,如输出、转置、求和、乘等。
现要求编程实现稀疏矩阵在“压缩”存储时的矩阵的常用操作,如输出、转置、求和、乘等。
即输入两个矩阵,完成如下操作:
(1) 转置。对第一个矩阵进行转置并输出,前面输出标题 “The transformed matrix is:”
(2) 矩阵加。如两个矩阵可以相加,进行两个矩阵的加运算并输出,前面输出标题 “The added matrix is:”;如果不能相加,则输出 “Can not add!”;
(3) 矩阵乘。如果两个矩阵可以相乘,进行两个矩阵的乘并输出,前面输出标题 “The product matrix is:”; 如果不能相乘,则输出 “Can not multiply!”
输入格式:
输入有多行,第1行包括三个整数,分别是矩阵的大小m,n及非零元素的个数r。后面r行分别输入各个非零元素的 行、列、值。
输出格式:
输出有两种形式,操作时分别用符号“L”、“H”指出输出形式。
L: 以三元组的形式输出,即先输出矩阵的行数、列数和非零元素个数,再按行主序依次输出各个非零元素的行、列和值。各输出项之间空格分隔。
H: 按人们习惯的矩阵格式输出,即输出一个mn的矩阵,是零元素的输出0,非零元素输出元素值。设定每个元素占位宽度为4。(要输出矩阵的行号和列号,并对齐)
输入样例:
输入样例1:
10 8 4
1 8 1
3 3 2
3 7 3
10 1 4
10 8 2
2 6 1
3 7 -3
H
输入样例2:
100 90 5
1 10 100
50 60 200
50 80 100
60 60 200
99 89 10
100 90 4
1 1 10
50 60 -200
50 80 100
70 70 10
L
输出样例:
输出样例1:
The transformed matrix is:
1 2 3 4 5 6 7 8 9 10
1 0 0 0 0 0 0 0 0 0 4
2 0 0 0 0 0 0 0 0 0 0
3 0 0 2 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0 0 0
7 0 0 3 0 0 0 0 0 0 0
8 1 0 0 0 0 0 0 0 0 0
The added matrix is:
1 2 3 4 5 6 7 8
1 0 0 0 0 0 0 0 1
2 0 0 0 0 0 1 0 0
3 0 0 2 0 0 0 0 0
4 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0
9 0 0 0 0 0 0 0 0
10 4 0 0 0 0 0 0 0
Can not multiply!
输出样例2:
The transformed matrix is:
Rows=90,Cols=100,r=5
10 1 100
60 50 200
60 60 200
80 50 100
89 99 10
The added matrix is:
Rows=100,Cols=90,r=6
1 1 10
1 10 100
50 80 200
60 60 200
70 70 10
99 89 10
Can not multiply!
代码:
![](https://img-blog.csdnimg.cn/53f1ded7120d45d5a0780c88d1695e4a.jpeg)
![](https://img-blog.csdnimg.cn/f42819919b944b6dae960d7136bfa868.jpeg)
7-165 找出相等差值的卡片
给定 N 张卡片,正面分别写上 1、2、……、N,然后全部翻面洗牌后,依然正面朝下依次排列,在背面分别写上 1、2、……、N。将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,找出其中差值相同的卡片。
输入格式:
输入第一行给出一个正整数 N(2 ≤ N ≤ 10 000),随后一行给出 1 到 N 的一个洗牌后的排列,第 i 个数表示正面写了 i 的那张卡片背面的数字。
输出格式:
按照差值从大到小输出重复的差值及其重复的次数,格式为:
差值 重复次数
每行输出一个结果。
输入样例:
在这里给出一组输入。例如:
8
3 5 8 6 2 1 4 7
输出样例:
在这里给出相应的输出。例如:
5 2
3 3
2 2
代码: