A-L1-2-第16讲- 插入排序
5393 n个数降序排序
描述
输入n个整数,使用插入排序,将n个数降序排序并输出。
输入描述
第一行,一个整数n(1≤n≤100);
第二行,n个整数,每个整数的范围1~1000,存入数组a中。
输出描述
一行n个整数,从大到小(降序)排列,使用空格隔开。
样例输入 1
5
10 137 568 326 754
样例输出 1
754 568 326 137 10
cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
int a[100]={0};
int n;
cin>>n;
int x;
for(int i=0;i<n;i++){
cin>>x;
int j;
for(j=i-1;j>=0;j--){
if(a[j]<x){
a[j+1]=a[j];
}
else break;
}
a[j+1]=x;
}
for(int i=0;i<n;i++){
cout<<a[i]<<' ';
}
return 0;
}
3810 奇数递增序列
描述
给定一个长度为 N(不大于 500 )的正整数序列,请将其中的所有奇数取出,并按升序输出。
输入描述
第 1 行为 N。
第 2 行为 N 个正整数,其间用空格间隔,数据保证至少有一个奇数。
输出描述
升序输出的奇数序列,数据之间用空格隔开。
样例输入 1
10
1 3 2 6 5 4 9 8 7 10
样例输出 1
1 3 5 7 9
提示
数据范围与提示
不大于 500
cpp
#include<bits/stdc++.h>
using namespace std;
int a[505],b[505],x,c;
int main() {
cin>>c;
for(int i=0;i<c;i++){
cin>>a[i];
if(a[i]%2==1){
b[x]=a[i];
x++;
}
}
for(int i=0;i<x;i++){
int z=b[i];
int j;
for(j=i-1;j>=0;j--){
if(b[j]>z){
b[j+1]=b[j];
}
else{
break;
}
}
b[j+1]=z;
}
for(int y=0;y<x;y++){
cout<<b[y]<<" ";
}
return 0;
}
2675 书架
描述
Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。现在,只有书架的顶上还留有一点空间。
为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不像演杂技一般,一头站在另一头的背上,叠成一座"奶牛塔"。当然,这个塔的高度,就是塔中所有奶牛的身高之和。为了往书架顶上放东西,所有奶牛的身高和必须不小于书架的高度。
所有 N(1≤N≤20000) 头奶牛都有一个确定的身高Hi(1≤Hi ≤10000)。设所有奶牛身高的和为S。书架的高度为B,并且保证 1≤B≤S<2,000,000,000。
显然,塔中的奶牛数目越多,整座塔就越不稳定,于是奶牛们希望在能够到书架顶的前提下,让塔中奶牛的数目尽量少。 现在,奶牛们找到了你,希望你帮她们计算这个最小的数目。

输入描述
第 1 行是两个用空格隔开的整数:N 和 B;
接下来N行是N个奶牛的身高。
输出描述
输出一个整数,即最少要多少头奶牛叠成塔,才能够到书架顶部。
样例输入 1
6 40
6
18
11
13
19
11
样例输出 1
3
cpp
#include<bits/stdc++.h>
using namespace std;
int n,b,j,x,num;
int a[20005];
int main(){
cin>>n>>b;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
int x=a[i];
for(j=i-1;j>=0;j--){
if(x>a[j])
a[j+1]=a[j];
else break;
}
a[j+1]=x;
}
int h=0,cnt=0;
while(h<b){
h+=a[cnt];
cnt++;
}
cout<<cnt;
return 0;
}
2674 逆序对
描述
最近,小童了解到一个叫"逆序对"的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中的一对整数(ai,aj),满足ai>aj且i<j。
知道这概念后,小童就想算一算给定的一段正整数序列中逆序对的数目。注意序列中可能有重复数字。
输入描述
第1行,一个数n,表示序列中有n个数。(n<=2500)
第2行,n个数,表示给定的序列。序列中每个数字不超过109。
输出描述
输出序列中逆序对的数目。
样例输入 1
6
1 2 3 3 5 6
样例输出 1
0
样例输入 2
5
5 1 1 0 4
样例输出 2
6
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[2500];
cin >> n;
for(int i=0; i<n; i++)
cin >> a[i];
//用于存储交换次数
int cnt = 0;
for(int i=0;i<n;i++){
int x=a[i];
int j;
for(j=i-1;j>=0;j--){
if(a[j]>x){
a[j+1]=a[j];
cnt++;//累计交换次数
}else break;
}
a[j+1]=x;
}
// 选择不稳定,所以不能实现
// for(int i=0;i<n-1;i++){
// for(int j=i+1;j<n;j++){
// if(a[i]>a[j]){
// int tmp = a[i];
// a[i]=a[j];
// a[j]=tmp;
// cnt++;//累计交换次数
// }else break;
// }
// }
cout << cnt;
return 0;
}