牛客网编程入门130题–精选(二)
本篇文章衔接博客:牛客网编程入门130–精选(一)
文章目录
题目OJ链接
1.图形相似度
描述
给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。
输入描述:
第一行包含两个整数m和n,表示图像的行数和列数,用单个空格隔开。1≤m≤100, 1≤n≤100。之后m行,每行n个整数0或1,表示第一幅黑白图像上各像素点的颜色,相邻两个数用单个空格隔开。之后m行,每行n个整数0或1,表示第二幅黑白图像上各像素点的颜色,相邻两个数用单个空格隔开。
输出描述:
一个实数,表示相似度(以百分比的形式给出),精确到小数点后两位。
示例1
输入:
3 3 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 0 0 1
输出:
44.44
💡思路
相似度 = (相等的元素的个数 / 总元素)*100%
参考代码
#include <stdio.h>
int main()
{
int m = 0,n = 0;
scanf("%d %d",&m,&n);
int arr1[m][n];//变长数组
int arr2[m][n];
int count = 0;//记录相同元素的个数
for(int i = 0;i<m;++i)
{
for(int j = 0;j<n;++j)
{
scanf("%d",&arr1[i][j]);
}
}
for(int i = 0;i<m;++i)
{
for(int j = 0;j<n;++j)
{
scanf("%d",&arr2[i][j]);
if(arr1[i][j] == arr2[i][j])
{
++count;
}
}
}
printf("%.2lf\n",((double)count)/m/n*100);
return 0;
}
解释:
- 代码中采用了C99标准提出的变长数组知识点,GCC编译器支持变长数组,Visual stdio不支持
- 在输入数组2元素时,就可以跟数组1的元素进行比较了,这样可以少遍历一遍,当然时间复杂度还是一样的
2.有序数组中插入一个数
描述
有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。
输入描述:
共三行,
第一行输入一个整数(0≤N≤50)。
第二行输入N个升序排列的整数,输入用空格分隔的N个整数。
第三行输入想要进行插入的一个整数。
输出描述:
输出为一行,N+1个有序排列的整数。
示例1
输入:
7 5 30 40 50 60 70 90 20
输出:
5 20 30 40 50 60 70 90
💡思路1
“取巧”(耍赖皮),只要符合输出结果即可
遍历原来数组,如果比
num
小就打印,如果比num
大,就先打印num
,再打印元素。这样就可以产生“视觉上”的插入数据。
参考代码
#include<stdio.h>
#include<stdbool.h>
int main()
{
int n = 0;
scanf("%d",&n);
int arr[n];
for(int i = 0;i<n;++i)
{
scanf("%d",&arr[i]);
}
int num = 0;
scanf("%d",&num);
bool flag = true;//判断是否需要插入数据
for(int i = 0;i<n;++i)
{
if(flag && num < arr[i])
{
printf("%d ",num);
flag = false;//插入完数据之后,之后就不需要再插入数据了
}
printf("%d ",arr[i]);
}
//有可能数据是最后插入的,所以咱们还需要检查一次
if(flag)
{
printf("%d",num);
}
return 0;
}
💡思路2
实实在在地进行插入数据
逻辑 – 将大象放进冰箱
第一步:找到数据需要插入的位置
第二步:挪动数据,将这个位置腾出来
第三步:将数据放进该位置
挪动数据的过程
为了不在挪动的过程中将数据覆盖
方法:从后面开始挪动数据
为了更加代码可读性,可维护性,咱们使用函数实现的特定的功能
- 函数find – 查找元素位置
- 函数insert – 进行数据插入的功能
参考代码