1 条题解

  • 0
    @ 2026-5-19 17:58:48

    好像这题确实不难。

    题意非常简单。

    可以使用优先队列维护,将所有人的能力中最大的 x,y,zx,y,z 取出来,如果这不是属于同一个人的,就立马输出来。

    否则,如果有两项是属于一个人 ii 的,那么 ii 就不可能进队,因为 ii 和后面的所有人组队一定会有两项数据是最大的。

    于是我们把 ii 标记掉,在 n1n-1 个人里面继续选,知道选完为止。

    注意被标记的人不可能进队,所以标记完要记得把 ii 在三个优先队列里面全部删除。

    #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

    [JOIST 2022] 团队竞技 / Team Contest

    信息

    ID
    7222
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者