1 条题解
-
0
好像这题确实不难。
题意非常简单。
可以使用优先队列维护,将所有人的能力中最大的 取出来,如果这不是属于同一个人的,就立马输出来。
否则,如果有两项是属于一个人 的,那么 就不可能进队,因为 和后面的所有人组队一定会有两项数据是最大的。
于是我们把 标记掉,在 个人里面继续选,知道选完为止。
注意被标记的人不可能进队,所以标记完要记得把 在三个优先队列里面全部删除。
#include<bits/stdc++.h> using namespace std; const int N = 150010; int n, a[N], b[N], c[N]; priority_queue<pair<int, int> > A, B, C; bool vis[N]; int main() { ios::sync_with_stdio(0); cin >> n; for(int i = 1; i <= n; i++) { cin >> a[i] >> b[i] >> c[i]; A.push(make_pair(a[i], i)); B.push(make_pair(b[i], i)); C.push(make_pair(c[i], i)); } for(int i = 1; i <= n; i++) { int x = A.top().second; int y = B.top().second; int z = C.top().second; if(b[x] == b[y] || c[x] == c[z]) vis[x] = 1; if(c[y] == c[z] || a[y] == a[x]) vis[y] = 1; if(a[z] == a[x] || b[z] == b[y]) vis[z] = 1; if(!vis[x] && !vis[y] && !vis[z]) { cout << a[x] + b[y] + c[z]; return 0; } while(!A.empty() && vis[A.top().second]) A.pop(); while(!B.empty() && vis[B.top().second]) B.pop(); while(!C.empty() && vis[C.top().second]) C.pop(); } cout << -1; return 0; }
- 1
信息
- ID
- 7222
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者