CF166A Rank List 题解

Content

\(n\) 个元素,第 \(i\) 个元素包含两个值 \(a_i,b_i\),按照以下规则排序:

  • 如果对于 \(i\neq j\)\(a_i\neq a_j\),则按照 \(a_i>a_j\) 的顺序排序。
  • 否则,按照 \(b_i<b_j\) 的顺序排序。

求排序后有多少元素和排在第 \(k\) 的元素的 \(a_i,b_i\) 完全相等。

数据范围:\(1\leqslant k\leqslant n\leqslant 50,1\leqslant a_i,b_i\leqslant 50\)

Solution

这题我们开一个结构体,每个元素都包含 \(a,b\) 两个值。读入完之后,按照上面的规则对元素进行排序,最后从第 \(k\) 个元素开始,向左向右遍历排序后的元素,直到当前元素不和第 \(k\) 的元素的 \(a,b\) 完全相等就停止,最后这个区间里面的数的个数就是我们的答案了。

排序的话可以自己手写一个 \(\texttt{cmp}\) 函数,也可以直接用结构体中的 \(\texttt{operator}\) 来实现。

Code

int n, k;
struct node {
	int a, b;
	bool operator < (const node& yy) const {
		if(a != yy.a)	return a > yy.a;
		return b < yy.b;
	}
}teams[57];

int main() {
	getint(n), getint(k);
	_for(i, 1, n)	getint(teams[i].a), getint(teams[i].b);
	sort(teams + 1, teams + n + 1);
	int l = k, r = k;
	while(teams[l - 1].a == teams[k].a && teams[l - 1].b == teams[k].b)	l--;
	while(teams[r + 1].a == teams[k].a && teams[r + 1].b == teams[k].b)	r++;
	int ans = r - l + 1;
	writeint(ans);
	return 0;
}
posted @ 2021-12-17 14:20  Eason_AC  阅读(30)  评论(0)    收藏  举报