信息奥赛课课通(C++)p144-1整理题库

版权声明:如果是我原创的文章,请转载时,注明是来自我的转帖,加上我帖子的地址。谢谢! https://blog.csdn.net/mengdicfm/article/details/82730812

问题描述:
为了提高大家的程序设计水平,谢老师建立了一个校内题库。题库中共有n道题,第i道题目的难易程度用ti表示,这n道题根据由易到难的顺序已排好。现在老师决定插入m道难度为dj的题到题库中,题库中的题仍然按由易到难的顺序排好。
输入格式:
第一行包含两个用一个空格隔开的n和m。
第二行包含n个用一个空格隔开的正整数tj,表示题库中每道题的难度。
第三行包含m个用一个空格隔开的正整数dj,表示待插入的每道题的难度。
1<=tj<=32767,1<=dj<=32767,1<=n<=1000,1<=m<=1000。
输出格式:
一行若干个用一个空格隔开的正整数,表示插入后题库的试题难度情况。
输入样例1:
5 1
1 1 2 3 7
1
输出样例1:
1 1 1 2 3 7
输入样例2:
5 2
1 3 5 7 9
2 8
输出样例2:
1 2 3 5 7 8 9

#include<iostream>
using namespace std;
int main()
{
    int n,m,i,j,t,k;
    int a[2001];
    cin>>n;
    cin>>m;
    //输入前n个数,放在数组的a[1]-a[n] 
    for(i=1;i<=n;i++)
    cin>>a[i];
    //输入后m个数,放在数组的a[n+1]-a[n+m]  
    for(i=1;i<=m;i++)
    cin>>a[n+i];
    // 遍历最后的m个数 
    for(i=n;i<=n+m;i++)
    {
    //如果当前的数字比前一个数字小,说明这个数字要往前挪动位置
    //如果当前数字比前一个数字大,因为难度从低到高排列,就没必要挪动位置 
    if(a[i]<a[i-1])
       {
        k=i-1;
        //k取当前a[i]的前一个下标 
        t=a[i];
        //t取当前a[i]的值,也就是要往前挪动的值 
        while(a[k]>t)  
            {
            a[k+1]=a[k];
            k--;
            }
        //当前k下标对应的数字a[k]比要挪动的数字值大,说明数字还要往前挪,
        //其余数据依次往后挪动,下标k在减小一个数字 
        a[k+1]=t;
       }
    }
    for(i=1;i<=n+m;i++)
    cout<<a[i]<<" ";
    return 0;
}

猜你喜欢

转载自blog.csdn.net/mengdicfm/article/details/82730812