#2022年合肥市经开区信息学初中组竞赛试题题解#

第一题:普通排序

时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

牛牛是一位编程爱好者,今天第一次参加初中组比赛,看到第一题,不要紧张,来一个简单的排序题 做一做,牛牛学过了很多排序,一直想练个手,这回机会来了,给牛牛N个数(n<=100),每个数都 在(0~1000)之间,其中由很多重复的数字,请将重复的数字只保留一个,并将剩下的数由小到大排 序并输出。

【输入】

输入有2行, 第1行为1个正整数,表示数的个数:N 

第2行有N个用空格隔开的整数。

【输出】

第1行为1个正整数M,表示不相同数的个数。 接下来的一行,从小到大输出排好序的不相同的数,每个数用逗号隔开。

【输入样例】

10
20 40 32 67 40 20 89 99 100 15

【输出样例】

8
15,20,32,40,67,89,99,100

【数据规模及约定】

n<=100,每个数都在(0~1000)之间

样例程序:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,a[101];
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++)
        cout<<a[i];
    return 0; 
}

第二题:进制转换
时间限制: 1000 ms         内存限制: 65536 KB

#1229:进制转换


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 61     通过数: 37

【题目描述】

牛牛在学习计算机基础的时候听过计算机中数据都是以二进制的形式保存的,随后对进制产生了兴趣,比如生活中最普通的十进制,由0,1,2,3,4,5,6,7,8,9十个数字构成,逢十进一,用10代表十,而二进制由0,1构成,逢二进一,用10代表二。那么如何将十进制转换成对应的进制呢?请你编写程序帮助牛牛解决这个问题,将一个十进制数X转换成任意进制数M (2<=M<=32)

【输入】

一行,整数X和M,X<=109,M<=32。

【输出】

十进制数X的M进制数。

【输入样例】

11 2

【输出样例】

1011

【提示】

对于十六进制来说,10在十六进制中是A,11在十六进制中是B,12在十六进制中是C,13在十 六进制中是D,14在十六进制中是E,15在十六进制中是F 比如十六进制中的1F换算程十进制就是31. 对于三十二进制来说,比如16在三十二进制中是G,依次类推

样例程序:

#include<bits/stdc++.h>
using namespace std;
int x,m,k,a[128];
int main()
{
    cin>>x>>m;
    if(x==0)    
        cout<<0;
    else
    {
        while(x>0)
        {
            k++;
            a[k]=x%m;
            x/=m;
        }
        for(int i=k;i>=1;i--)
            if(a[i]<10)    
                cout<<a[i];
            else    
                cout<<char(a[i]-10+'A');
    }
    return 0;
}

第三题:重复出现的数

时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

牛牛同学拿到了2组数字,请你编程帮他找出,第2组数中的哪些数,在第1组数中出现了,从小到大输出所有满足条件的数。 比如: 

第1组数有:8 7 9 8 2 6 3 

第2组数有:9 6 8 3 3 2 10 

那么应该输出:2 3 3 6 8 9

【输入】

第一行两个整数n和m,分别代表2组数的数量

第二行n个正整数

第三行m个正整数

对于60%的数据1≤n,m≤1000,每个数<=2*109 

对于100%的数据1≤n,m≤100000,每个数<=2*109

【输出】

按照要求输出满足条件的数,数与数之间用空格隔开

【输入样例】

7 7
8 7 9 8 2 6 3
9 6 8 3 3 2 10

【输出样例】

2 3 3 6 8 9

样例程序:

#include<bits/stdc++.h>
using namespace std;
int a[100005],b[100005],c[100005],n,m,k;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",a+i);
    for(int i=1;i<=m;i++)scanf("%d",b+i);
    sort(a+1,a+1+n);
    sort(b+1,b+1+m);
    int x=1,y=1;
    while(x<=n&&y<=m)
    {
        while(x<=n&&a[x]<b[y])x++;
        if(b[y]==a[x])printf("%d ",b[y]);
        y++;
    }
    return 0;
}

第四题:最短的路
时间限制: 1000 ms         内存限制: 65536 KB

题目描述】

该题与一本通题库的1381是一样的。

牛牛被邀请参加安徽省田径爱好者聚会,是在城市n,而牛牛当前所处的城市为1,附近还有很多城市2~n-1, 有些城市之间没有直接相连的路,有些城市之间有直接相连的路,这些路都是双向的,当然也可能有多条。 现在给出直接相邻城市的路长度,牛牛想知道从城市1到城市n,最短多少距离。

【输入】

输入n, m,表示n个城市和m条路; 

接下来m行,每行a b c, 表示城市a与城市b有长度为c的路。 

1≤n≤2000。 

1≤m≤10000。 

0≤c≤10000。

【输出】

输出1到n的最短路。如果1到达不了n,就输出-1。

【输入样例】

5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100

【输出样例】

90

样例程序:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[2005][2005],c[2005],b[2005];
int main()
{
    memset(a,127,sizeof(a));
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        a[x][y]=a[y][x]=min(a[x][y],z);
    }
    for(int i=1;i<=n;i++) c[i]=a[1][i];
    c[1]=0;
    b[1]=1;
    for(int i=1;i<n;i++)
    {
        int mi=0x7fffffff;
        int k=0;
        for(int j=1;j<=n;j++)
        {
            if(!b[j]&&c[j]<mi)
            {
                mi=c[j];
                k=j;
            }
        }
        if(!k) break;
        b[k]=1;
        for(int j=1;j<=n;j++)
        {
            c[j]=min(c[k]+a[j][k],c[j]);
        }
    }
    cout<<c[n];
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值