poj 4088:集合运算

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-06 00:11:03

poj 4088:集合运算的相关文章

poj 4088:Set操作

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

sql的基础语句-单行函数,dual,数字函数,日期函数,表连接,集合运算,分组报表,单行子查询,多行子查询

3. 单行函数 3.1 转换函数 select ascii('A'),chr(65) from dual; select to_char(1243123),1231451 from dual;靠左边的就是字符串,靠右边的就是数字 select to_char(123512a121) from dual;   --错误的写法,没有引号表示数字,但是数字里面包含了字母,不合法的输入值 select to_number('123141211') from dual; select to_number(

oracle中 常用的 join on 相关和 集合运算的总结

sql常用联合查询的 join on . left join(左连接) . right join (右连接).inner join (等值连接)以及常用的集合运算有:union.unionall.minus.intersect的效果和总结 首先接着用上一篇的book表和pbook表: 首先把join on和inner join 放在一起: select * from book a join ( select id,name,price from pbook) b on a.id=b.id; se

SQL集合运算 差集 并集 交

SQL-3标准中提供了三种对检索结果进行集合运算的命令:并集UNION:交集INTERSECT:差集EXCEPT(在Oracle中叫做 MINUS).在有些数据库中对此的支持不够充分,如MySql中只有UNION,没有其他两种.实际上这些运算都可以通过普通的SQL来实现,虽然有时有些繁琐. 假设有两个表(或视图)s,t,s中有两个字段sa,sb:t中有两个字段ta,tb: 差集EXCEPT: PLAIN TEXT SQL: SELECTsaFROMs EXCEPT SELECTtaFROMt;

SQL集合运算

转载:详解SQL集合运算 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式-上篇 [T-SQL基础]04.表表达式-下篇 [T-SQL基础]05.集合运算

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-06 集合运算

T-SQL支持3种集合运算:并集(UNION).交集(INTERSECT)和差集(EXCEPT).集合运算涉及的两个查询不能包含ORDER BY子句. UNION ALL集合运算 UNION ALL不会对行进行比较,也不会删除重复行.假设查询Query1返回m行,查询Query2返回n行,则Query1 UNION ALL Query2返回(m+n)行. SELECT country, region, city FROM HR.Employees UNION ALL SELECT country

INTERSECT(交集)集合运算

在集合论中,两个集合(记为集合A和B)的交集是由既属于A,也属于B的所有元素组成的集合. 在T-SQL 中,INTERSECT 集合运算对两个输入查询的结果集取其交集,只返回在两个查询结果集中都出现的行. INTERSECT DISTINCT集合运算 INTERSECT 集合运算在逻辑上首先删除两个输入多集中的重复行(把多集变为集合),然后返回只在两个集合中都出现的行.换句话说,如果一个行在两个输入多集中都至少出现一次,那么交集返回的结果中将包含这一行. SELECT c FROM a INTE

UNION(并集)集合运算

在集合论中,两个集合(记为集合A和B)的并集是一个包含集合A和B中所有元素的集合.换句话说,如果一个元素属于任何一个输入集合,那么它也属于结果集. 在T-SQL中,UNION 集合运算可以将两个输入查询的结果集组合成一个结果集.如果一个行在任何一个输入集合中出现,它也会在UNION运算的结果中出现.T-SQL 支持在UNION集合运算中使用UNION ALL 和UNION(隐含DISTINCT,DISTINCT不能显示指定)选项. UNION ALL 集合运算 对于作为运算的输入查询而生成的多集

详解SQL集合运算

以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式-上篇 [T-SQL基础]04.表表达式-下篇 [T-SQL基础]05.集合运算 [T-SQL基础]06.透视.逆透视.分组集 [T-SQL基础]07.数据修改 [T-SQL基础]08.事务和并发 [