AT_abc348_c [ABC348C] Colorful Beans 题解

题目传送门

题目大意

题目描述

N N N 种豆子,第 i i i 中豆子的美味度是 a i a_i ai,颜色是 c i c_i ci 豆子是混合的,只能通过颜色来区分。

每一种颜色都有一个美味度最小的豆子,你需要求出这里面最大的美味度。

样例 1 1 1 解释:

这里有两个颜色是 1 1 1 的豆子,美味度是 100 100 100 40 40 40,最小美味度为 40 40 40

还有两个颜色是 5 5 5,美味度是 20 20 20 30 30 30,最小美味度为 20 20 20

最后取 max ⁡ ( 20 , 40 ) = 40 \max(20 , 40) = 40 max(20,40)=40,所以答案为 40 40 40

数据范围
  • 1 ⩽ N ⩽ 2 × 1 0 5 1 \leqslant N \leqslant 2 \times 10^5 1N2×105
  • 1 ⩽ A i ⩽ 1 0 9 1 \leqslant A_i \leqslant 10^9 1Ai109
  • 1 ⩽ C i ⩽ 1 0 9 1 \leqslant C_i\leqslant 10^9 1Ci109
  • 输入数据全部都是整数。

解题思路

对于每种颜色的豆子,我们先找到美味度最小的那个,最后找出这些不同种类的豆子中美味度最大的即可。

那我们怎么找到第 i i i 种豆子中美味度最小的那个呢?这里给出两种思路:

  1. 使用桶的思想标记。
  2. 对于每一种的豆子按照美味度从大到小排序。

注意: 如果你使用的是思路一,那么你不能使用数组进行标记,因为数据范围很大,因此我们可以使用 map 进行标记。

第一种思路的代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
struct node {
	int a, c;
}b[200010];
map<int, int> m;
signed main() {
ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> b[i].a >> b[i].c;
		if (m[b[i].c] == 0)
			m[b[i].c] = b[i].a;
		else 
		m[b[i].c] = min(m[b[i].c], b[i].a);
	}
	int ans = -1e9;
	for (int i = 1; i <= n ;i ++){
		ans = max(m[b[i].c], ans);
	}
	cout << ans;
  	return 0;
} 

第二种思路的代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
struct node {
	int a, c;
	inline bool operator < (const node f) const {
		if (c != f.c)
			return c < f.c;
		return a < f.a;
	}
}b[200010];
//bool cmp(node a, node b){
//	if (a.c != b.c)
//		return a.c < b.c;
//	return a.a < b.a;
//}
signed main() {
ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> b[i].a >> b[i].c;
	sort(b + 1, b + 1 + n);
	int ans = -1e9;
	for (int i = 1; i <= n; i++)
		if (b[i].c != b[i - 1].c)
			ans = max(ans, b[i].a);
	cout << ans;
	return 0;
}

总结

这道题目还是很水,主要考察的是桶或者结构体排序,如果需要程序运行速度更快,建议大家使用第二种方法完成这道题目,因为本题使用第二种方法比第一种方法快两倍,如果需要以最快的速度完成这道题,那么建议使用第一种方法,因为代码要短 50 50 50 个字符。总体来说思路比较好想,本人想到的是第一种方法 ,可能是 map 用多了导致的吧,总之 map 非常实用,建议大家去学习学习。

西格玛矩阵:
∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ \sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum ∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ \sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum ∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ \sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum ∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ \sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum ∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ \sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum ∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ \sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum ∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ \sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum ∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ \sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum ∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ \sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum ∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ \sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum\sum ∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
不得不说,看起来感觉还行。

  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值