poj 4088:Set操作

poj 4088:集合运算

题目:(至于4089。那个问题做过。使用归并思想,所以没有写)

描写叙述

小张须要从一批数量庞大的正整数中挑选出第k小的数。由于数据量太庞大,挑选起来非常费劲,希望你能编程帮他进行挑选。

输入
第一行第一个是数据的个数n(10<=n<=106)。第二个是须要挑选出的数据的序号k(1<=k<=105),n和k以空格分隔;

第二行以后是n个数据T(1<=T<=109),数据之间以空格或者换行符分隔。

输出
第k小数(假设有同样大小的也进行排序。比如对1,2,3,8,8。第4小的为8。第5小的也为8)。
例子输入
10 5
1  3  8 20 2
9 10 12  8 9 
例子输出
8

解题方案

借用于高速排序思想,查找第K小元素

代码

#include <iostream>
#include <fstream>
using namespace std;

void main_solution();
void read_data( int *& data,int &n,int &k );
int min_k(int *data,int s,int e,int k);

int main()
{
	main_solution();
	system("pause");
	return 0;
}

void read_data( int *& data,int &n,int &k )
{
	ifstream reader;
	reader.open( "data.txt" );
	reader>>n;
	reader>>k;
	data = new int[n];
	for(int i=0;i<n;i++)
	{
		reader>>data[i];
	}
	reader.close();
}

int min_k(int *data,int s,int e,int k)
{
	int  t = s;
	int another = e;
	while(t != another)
	{
		if( t < another )
		{
			if( data[t] <= data[another] )
				another --;
			else
			{
				int d = data[another];
				data[another] = data[t];
				data[t] = d;

				d = another;
				another = t;
				t = d;
			}
		}
		else
		{
			if( data[t] >= data[another] )
				another ++;
			else
			{
				int d = data[another];
				data[another] = data[t];
				data[t] = d;

				d = another;
				another = t;
				t = d;
			}
		}
	}

	if( k == t-s+1 )
		return data[t];
	else if( k < t-s+1 )
		return min_k(data,s,t-1,k);
	else return min_k(data,t+1,e,k - (t-s+1));

}

void main_solution()
{
	int * data;
	int n;
	int k;
	read_data(data,n,k);
	cout<<min_k(data,0,n-1,k)<<endl;
}
时间: 2024-10-17 10:31:21

poj 4088:Set操作的相关文章

poj 4088:集合运算

poj 4088:集合运算 题目:(至于4089,那个问题做过,使用归并思想,所以没有写) 描述 小张需要从一批数量庞大的正整数中挑选出第k小的数,因为数据量太庞大,挑选起来很费劲,希望你能编程帮他进行挑选. 输入 第一行第一个是数据的个数n(10<=n<=106),第二个是需要挑选出的数据的序号k(1<=k<=105),n和k以空格分隔: 第二行以后是n个数据T(1<=T<=109),数据之间以空格或者换行符分隔. 输出 第k小数(如果有相同大小的也进行排序,例如对1

伸展树总结

最近做的一些Splay题及思路 BZOJ 1588 就是求一个数的前驱和后继,用Splay很简单 POJ 3468  很经典的线段树题目,用Splay做练习懒惰标记 HDU 1890  涉及区间翻转,注意直接以数列下标建树,对原数列排序后,直接查找,找到后删除. HDU 3436  很好的一道题,首先离散化,Splay 树中每个节点表示的是一段区间, TOP:首先删除这个元素,再将其插入到队首 RANK:即寻找第K大,经典操作 QUERY:将该元素Splay 到根部,size[ch[root][

poj 3225 区间(区间的交并补操作)

http://poj.org/problem?id=3225 一道题又做了一天..这道题对我来说起初有N多难点. 1:区间的开闭如何解决.. 2:怎样把区间的交并补.对称差转化为对线段树的操作. 后来与实验室的同学讨论了后解决了前面两个问题. 对于区间的开闭,可以将区间放大一倍,偶数点表示端点,奇数点表示区间内线段,前开的话左端点加1,右开的话右端点减1.例如[1,3]可以表示成[2,6],(1,3)表示成(3,5). 对于区间的交并补问题,可以转化为区间覆盖问题,若T区间为[a,b]. U T

转载::POJ 2991 线段树+计算几何(有c++结构体操作)

POJ 2991 线段树+计算几何 (2011-02-27 21:13:44) 转载▼ 标签: 杂谈 分类: OI 话说这一题真的是很恶心很恶心,不过确实改变了我对线段树的一些看法,算是很经典的题目. 题意:有一个吊车由很多个不同长度的线段组成,一开始是一条长直线起点在(0,0),尾节点在(0,sum[n]),每条线段之间的夹角的初始值是180度.然后有一些操作a. b将第a条线段和a+1之间的夹角变成b度,经过每一次操作都要求出尾节点的坐标. 首先要用到一个计算几何的知识(没学过..请教而来)

POJ C++程序设计 编程题#4 字符串操作

编程题#4: 字符串操作 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 给定n个字符串(从1开始编号),每个字符串中的字符位置从0开始编号,长度为1-500,现有如下若干操作: copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串. add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回

Splay树(多操作)——POJ 3580 SuperMemo

对应POJ题目:点击打开链接 SuperMemo Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 11309   Accepted: 3545 Case Time Limit: 2000MS Description Your friend, Jackson is invited to a TV show called SuperMemo in which the participant is told to play a

POJ C++程序设计 编程题#2 编程作业—文件操作与模板

编程题#2: 实数的输出格式 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 1000kB 描述 利用流操纵算子实现: 输入一个实数,先以非科学计数法输出,小数点后面保留5位有效数字:再以科学计数法输出,小数点后面保留7位有效数字. 注意:在不同系统.编译器上的输出格式略有不同,但保证在程序中采用默认格式设置一定能在OJ平台上得到正确结果. 输入 以非科学计数法表示的一个正实数,保证可以用dou

POJ C++程序设计 编程题#3 编程作业—文件操作与模板

编程题#3: 整数的输出格式 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 1000kB 描述 利用流操纵算子实现: 输入一个整数,先将该整数以十六进制输出,然后再将该整数以10个字符的宽度输出,宽度不足时在左边补0. 注意:在不同系统.编译器上的输出格式略有不同,但保证在程序中采用默认格式设置一定能在OJ平台上得到正确结果. 输入 一个正整数,保证可以用int类型存储. 输出 第一行:以十六进

POJ 1007 WZJ的数据结构(七) 树上操作

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=983 WZJ的数据结构(七) 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给你一棵N个节点的无根树,每个点有一个权值(开始都是0).请你设计一个数据结构,完成以下功能: 给你a.b.v,请将a到b路径中的节点权值都增加v(包括a点与b点).最后输出每个节点的权值. 输入 第一行为一个正整数N.接下来