第一篇博客写得过于草率,因此对此进行修改。
一、桶排基础
该题来自于我学校的刷题网站,本人在多位学长、同学的指教之下写出来的代码。由于本人基础一般,用的方法可能不是很好,有不足之处还请指教。代码如下:
#include<stdio.h>
int main()
{
int i,n,k,b=0,c=0;
int a[1001]= {0}; //定义并初始化数组
scanf("%d %d",&n,&k);
for(i=0; i<n; i++)
{
scanf("%d",&b); //统计各数字出现的次数
a[b]++;
}
for(i=1000; k; i--)
{
if(a[i]>0)
{
printf("%d ",i); //输出前k位大的数
k--;
}
}
return 0;
}
就本题而言所用到的桶排思路:
将价格(1~1000)平均分成1000组,多组输入,每输入一个数i,则对应的的a[i]加1,;最后输出时,a[i]有多大就输出几次,再根据题目要求,输出前k位的数。方法较为基础。
二、数组——擂台法
题目来源:
描述
又到了牛子爷的学习时间,这里有一些牛子爷开始学习的时间点(24小时制,同一天内),为了让牛子爷不睡懒觉好去内卷,请找出这一天内牛子爷可以学习的最早时间点
格式
输入格式
输入一个数n,代表牛子爷一天内可以学习的时间点的个数(1<=n<=1000)
输入n个时间点 时间点由两个整数组成,第一个整数代表时钟,第二个整数代表分钟
输出格式
输出牛子爷可以学习的最早时间点 时间点由两个整数组成,第一个整数代表时钟,第二个整数代表分钟(不足两位数的要补前导0)
样例
样例输入 Copy
3
22 32
3 52
5 51
样例输出 Copy
03 52
个人解答如下:
#include<stdio.h>
int main()
{
int a[1100]= {0};
int b[1100]= {0};
int m,n,i,t,min1=0,min2=0;
scanf("%d",&t);
for(i=0; i<t; i++)
{
m=0,n=0;
scanf("%d %d",&n,&m);
a[i]=n;
b[i]=m;
}
min1=a[0],min2=b[0]; 擂台法,先将a[0],b[0]分别设为最小值
for(i=1; i<t; i++)
{
if(a[i]<min1)
{
min1=a[i],min2=b[i];
}
if(a[i]>min1)
continue;
if(b[i]<min2)
{
min1=a[i],min2=b[i];
}
if(b[i]>min2)
continue;
}
if(min1<10&&min2<10) //题目设下的一个坑,注意要输出两位数
printf("0%d 0%d",min1,min2);
else if(min1<10)
printf("0%d %d",min1,min2);
else if(min2<10)
printf("%d 0%d",min1,min2);
else
printf("%d %d",min1,min2);
return 0;
}
解题思路:
- 多组输入,分别给数组a,b的数组元素赋对应的值;
- 设a[0],b[0]为最小值;
- 先将a[0]与后面的a[1]、a[2]......进行比较,若这些值大小都不相等,则输出其最小值,同时输出对应的b数组元素的值;
- 如果有a[i],a[j]...等的值都为最小值,则进行下一步比较——将b[i]与后面的b[j]......进行比较,输出其中的最小值,同时输出对应的a的数组元素。
- 注意因为题目要求至少输出两位数组,所以如果输出的数组元素a,b的值小于10的话,需要在前面加个0。
心得体会:1.这两题分别用到了桶排法、擂台法。
2.当算法的运行时间超限时,可以考虑使用桶排法,可以减小其时间复杂度。
这次修改可能仍然存在许多不足,还望斧正。