NYOJ 678 最小K个数之和

最小K个数之和

时间限制:1000 ms  |  内存限制:65535 KB

难度:2

描述

输入n个整数,输出其中最小的K个数之和。例如输入4,5,1,1,6,2,7,3,3这9个数字,当k=4,则输出最小的4个数之和为7(1,1,2,3)。

输入
测试样例组数不超过10

每个测试案例包括2行:

第一行为2个整数n,k(1<=k<=n<=100000)

第二行包含n个整数,每个整数的范围为【1~2000】

输出
对应每个测试案例,输出最小的k个数之和。
样例输入
8 4
5 2 1 3 8 1 9 3
样例输出
7
AC码:
#include<stdio.h>
int main()
{
	int n,k,i,num[2005],sum=0,a;
	while(~scanf("%d%d",&n,&k))
	{
		for(i=0;i<=2000;i++)
			num[i]=0;
		sum=0;
		for(i=0;i<n;i++)
		{
			scanf("%d",&a);
			num[a]++;
		}
		for(i=1;i<=2000;i++)
		{
			if(num[i]==0)
				continue;
			if(num[i]<=k)
			{
				sum+=i*num[i];
				k=k-num[i];
			}
			else
			{
				sum+=k*i;
				break;
			}
		}
		printf("%d\n",sum);
	}
	return 0;
}

NYOJ 678 最小K个数之和

时间: 2024-11-16 05:47:06

NYOJ 678 最小K个数之和的相关文章

最小K个数之和

描述 输入n个整数,输出其中最小的K个数之和.例如输入4,5,1,1,6,2,7,3,3这9个数字,当k=4,则输出最小的4个数之和为7(1,1,2,3). 输入 测试样例组数不超过10 每个测试案例包括2行: 第一行为2个整数n,k(1<=k<=n<=100000) 第二行包含n个整数,每个整数的范围为[1~2000] 输出 对应每个测试案例,输出最小的k个数之和. 样例输入 8 4 5 2 1 3 8 1 9 3 样例输出 7 1 #include <stdio.h> 2

nyoj-678-最小K个数之和(排序)

最小K个数之和 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 输入n个整数,输出其中最小的K个数之和.例如输入4,5,1,1,6,2,7,3,3这9个数字,当k=4,则输出最小的4个数之和为7(1,1,2,3). 输入 测试样例组数不超过10 每个测试案例包括2行: 第一行为2个整数n,k(1<=k<=n<=100000) 第二行包含n个整数,每个整数的范围为[1~2000] 输出 对应每个测试案例,输出最小的k个数之和. 样例输入 8 4 5 2 1 3

算法试题 - 找出最小 k 个数

题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k),堆是完全二叉树的一种,最大堆就是最上面的数是最大的该方法基于二叉树或者堆来实现,首先把数组前k个数字构建一个最大堆,然后从第k+1个数字开始遍历数组,如果遍历到的元素小于堆顶的数字,那么久将换两个数字,重新构造堆,继续遍历,最后剩下的堆就是最小的k个数,时间复杂度O(nlog k). 思路2 排序

最小k个数

最近在LeetCode(https://leetcode-cn.com/)上面做练习打卡,大致记录一下思路和题解 题目: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思路1: 对数组arr进行排序,将前k个数存放到新数组res中,所得数组即为所求 代码: 这种方法效率高,所用时间短,是今天突然想到的,思路2是当时的方法 思路2: 连续k轮找出数组arr中的最小值,将该值记录到新数组res中,并将该值赋为

数组中 最小K个数

1 基于快排中 partition函数的思想 一定要注意那里是对容器的地址 或者引用操作 否则传不出来!!! public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> result; if(input.empty() || k>input.size() || k<=0) return result; int start = 0; int end =

编程算法 - 最小的k个数 代码(C)

最小的k个数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入n个整数, 找出其中的最小k个数. 使用快速排序(Quick Sort)的方法求解, 把索引值(index)指向前k个数. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdl

编程算法 - 最小的k个数 红黑树 代码(C++)

最小的k个数 红黑树 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入n个整数, 找出其中的最小k个数. 使用红黑树(multiset), 每次替换最大的值, 依次迭代. 时间复杂度: O(nlogk). 代码: /* * main.cpp * * Created on: 2014年6月29日 * Author: wang */ #include <iostream> #include <vector> #includ

找出最小的k个数

•已知数组中的n个正数,找出其中最小的k个数. •例如(4.5.1.6.2.7.3.8),k=4,则最小的4个数是1,2,3,4 •要求: –高效: –分析时空效率 •扩展:能否设计出适合在海量数据中实现上述运算? 方法一: 1 //利用最大根堆实现最小k个节点 2 //最大根堆特点:每个节点都比他左右孩子要大 3 //调整最大堆的时间复杂度为O(lnK),因此该算法(问题)时间复杂度为O(nlnK). 4 //思路:通过数组建堆 5 //规律:第i个节点的左孩子为2i+1,右孩子为2i+2 6

剑指Offer28 最小的K个数

包含了Partition函数的多种用法 以及大顶堆操作 1 /************************************************************************* 2 > File Name: 28_KLeastNumbers.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月31日 星期三 19时45分41秒 6 *******