题目内容


Find the Kth number

题目内容:
給定N個排序好的序列,每個序列內有M個數字。因此我們總共有N*M個數字,編號為1~N*M。
將N*M個數字排序後輸出第K個數字是多少。


Hint : 直接將N*M個數字做排序會超過時間限制。
Hint : 每次花O(N)的時間找一個數字,一直找到第K個數字也會超過時間限制。
Hint : 使用一個大小為N的heap,記錄每個序列目前最小的數字是多少,以及這是該序列的第幾個數字。
Hint : 不要將N*M個數字都產生出來,會超過memory限制。


输入格式:
只有一筆測資。
第一行有三個數字N M K,意義如題目所述。
接下來的N行,每行有2個數字a b,代表一個f(x) = ax+b。這一行的序列即為[f(1), f(2), … , f(M)]。你可以假設每一行的f(x)都會是一個遞增函數,使得你的序列肯定是排序好的序列(由小到大)。


數字範圍:
0 < N <= 17000
0 < M <= 10000


0 <= a,b <= 100


输出格式:
輸出一行數字,第K個數字是多少。


输入样例:
3 3 7
1 3
2 2
3 1


输出样例:
7

时间限制:500ms内存限制:128000kb

利用STL

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */


int main() {
	priority_queue<vector<int> > que;
	int n,m,k;
	cin>>n>>m>>k;
	int array[n][2];
	for(int i=0;i<n;i++){
		cin>>array[i][0]>>array[i][1];
	}
	// initialize que
	for(int i=0;i<n;i++)
	{
		vector<int> item;
		item.push_back(-array[i][0]-array[i][1]);
		item.push_back(i);
		item.push_back(1);
		que.push(item);
	}
	int value,idx,a,b,x,new_value;
	// k-1 times pop()
	for(int i=0;i<k-1;i++)
	{
		vector<int> item;
		item = que.top();
		que.pop();
		value = -item[0];
		idx = item[1];
		x = item[2];
		a = array[idx][0];
		b = array[idx][1];
		if(x+1<=m)
		{
			new_value=a*(x+1)+b;
			item[0]=-new_value;
			item[2]=x+1;
			que.push(item);
		}
	}
	//k-th pop
	vector<int> item;
	item = que.top();
	cout<<-item[0];
	return 0;
}