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;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值