STL:set的排序應用

心得

排序題的話,複雜度高一點的用sort肯定就TLE了,還得看set呀,上題目

題目

  1. 丁神去谷歌
    時間限制 1000 ms 內存限制 65536 KB
    題目描述
    丁神要去Google上班了,去之前丁神想再做一道水題,但時間不多了,所以他希望題目做起來既水又快。現在一共有n道題,編號從1到n,每道題有兩個值a和b,a爲做這道題需要的時間,b爲題目的“水值”,丁神希望做b/a最大的那題。
    輸入格式
    輸入第一行爲數據組數T(T≤10),接下來T組數據,每組數據中第一行爲一個數n,n爲題目的數量,接下來n行,每行兩個正整數a和b。如果兩道題b/a的值是一樣的就輸出a比較小的,如果還一樣就輸出編號比較靠前的。 1≤a,b≤10^9,1≤n≤100000)
    輸出格式
    對於每組數據,輸出對應的題目編號,每個輸出佔一行。
輸入樣例
1
2
3 5
4 8
輸出樣例
2

AC代碼

#include <bits/stdc++.h>

using namespace std;

struct Problem{
	long long order;
	double aa;
	double bb;
	Problem(long long o,double a,double b):order(o),aa(a),bb(b){}
	bool operator <(const Problem& c)const
	{
		if(bb/aa == c.bb/c.aa&&aa==c.aa) return order<c.order;//這一行不寫也行,set的性質,不寫的話還省了100ms,難道說排序規則越多,複雜度越大???
		else if(bb/aa == c.bb/c.aa&&aa!=c.aa) return aa < c.aa;
		else return bb/aa > c.bb/c.aa;
	}
};

set<Problem>myset;


int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		myset.clear();
		long long n;
		scanf("%lld",&n);
		for(long long i=1;i<=n;i++)
		{
			double a,b;
			scanf("%lf%lf",&a,&b);
			myset.insert(Problem(i,a,b));
		}
		set<Problem>::iterator it;
		for(it=myset.begin();it!=myset.end();it++)
		{
			printf("%lld\n",(*it).order);
			break;
		}
	}
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章