赞
踩
给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是4,1,2,3(按照原数组顺序输出)。
数据范围:0<k,n<=10000,n>=k,数组中每个数的大小0<=val<=1000,
输入第一行长度n,个数k
第二行数组的各个元素
按原数组顺序输出最小的k个数,每个数的后面均有空格
在这里给出一组输入。例如:
- 8 4
- 4 5 1 6 2 7 3 8
在这里给出相应的输出。例如:
4 1 2 3
思路:先对数据进行排序,确定最小值k个数的范围,然后遍历原始数据,对符合范围要求的数据进行输出,但要特别注意的是要确定最小K个数中最大值的个数,输出完最大值的个数后再不能对最大值进行输出。
- #include<stdio.h>
- int main()
- {
- int n,m,min,max,maxcount=0;
- int data[10000],a[10000];
- scanf("%d%d",&n,&m);
- for(int i=0;i<n;i++)
- {
- scanf("%d",&a[i]);
- data[i]=a[i];
- }
- for(int i=0;i<n-1;i++)
- {
- min=i;
- for(int j=i+1;j<n;j++)
- {
- if(data[j]<data[min])
- {
- min=j;
- }
- }
- if(min!=i)
- {
- int temp=data[i];
- data[i]=data[min];
- data[min]=temp;
- }
- }
- max=data[0];
- min=data[0];
- for(int i=1;i<m;i++)
- {
- if(data[i]>max)
- {
- max=data[i];
- }
- if(data[i]<min)
- {
- min=data[i];
- }
- }
- for(int i=0;i<m;i++)
- {
- if(data[i]==max)
- {
- maxcount++;
- }
- }
- for(int i=0;i<n;i++)
- {
- if(a[i]>=min&&a[i]<=max)
- {
- if(a[i]==max&&maxcount!=0)
- {
- printf("%d ",a[i]);
- maxcount--;
- }
-
- if(a[i]!=max)
- {
- printf("%d ",a[i]);
- }
-
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。