洛谷題解 P1138 【第k小整數】

在我的博客食用效果更佳!https://www.cbw2007.tk/articles/luogu-P1138-sol/,文章最初發表於2019年5月22日。更多見在不同的網站瀏覽本站內容

原題鏈接: P1028 第k小整數 - 洛谷 | 計算機科學教育新生態

STL大法吼啊!

分析

這道題有兩個步驟:排序、去重。

解決這個問題的方法有很多:sort+遍歷去重、unique、其他高端數據結構等。我本來想選第一種方法的,後來我突然想起有一種STL可以自動去重+排序,那就是set,那豈不是很簡單?(美滋滋)結果更難了

SET用法解析

需要包含的頭文件:

#include<set>

它的定義方法:

set<type> name;
//例子:定義int型,取名爲a
set<int> a;

我們要用到的函數:

iterator begin(); //指向第一個元素的迭代器
iterator end(); //指向最後一個元素的迭代器
pair insert(const type &val); //在集合中插入val元素,並返回指向該元素的迭代器和一個布爾值來說明val是否成功的被插入了
size_type size(); //返回元素數目

遍歷方法:

int cnt=0;//用於記錄遍歷到第幾個了
for (set<int>::iterator i=a.begin();i!=a.end();i++)
{
	cnt++;
	if (cnt==k)//達到終點
		cout<<*i;
}

更多STL工具見文末!

應用在此題中

首先,我們可以使用insert函數用來插入元素。然後使用size來判斷元素夠不夠 k 個,最後按照上文的方法進行遍歷即可!

本文代碼:

#include<iostream>
#include<set>
using namespace std;
set<int> a;//定義集合
int main()
{
	int n,k;
	cin>>n>>k;
	for (int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		a.insert(x);//插入元素
	}
	if (a.size()>=k)//判斷元素數量是否足夠
	{
		int cnt=0;//標記遍歷到了第幾個
		for (set<int>::iterator i=a.begin();i!=a.end();i++)//遍歷
		{
			cnt++;
			if (cnt==k)//到達目的地
				cout<<*i;//輸出
		}
	}
	else
		cout<<"NO RESULT";//輸出無解
	return 0;//完結撒花ヽ(≧∀≦)ノ
}

附:c&cppAPI.chm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章