UVA10125 Sumsets 题解

题意简述

  • 给一个集合 S,找一个最大的数 d 满足 a+b+c=d,且 abcd 是集合 S 中不同的数。

解题思路

思路很简单,将 a+b+c=d 中的 c 移项到右边,变为 a+b=dc。可以用 map 记录下所有可能的 a+b 的值,再枚举所有的 cd,对于每一组 cd,计算出 dc,并查找是否出现此值。如果出现过,并且 abcd 是两两不相同的数,那么打擂台找出最大的 d 即可。

注意当枚举结束后若没有任何数符合要求,要输出 no solution。

总的时间复杂度应该是 O(tn2),其中 t 表示测试数据组数。本题数据中貌似 t 很小,所以可以过。

代码实现

#include<bits/stdc++.h>
using namespace std;
const int N=1010,INF=0x3f3f3f3f;
int n,a[N],c,x,y,res;
unordered_map<int,pair<int,int> > mp;
int main() {
	while(scanf("%d",&n),n) {
		mp.clear();
		res=-INF;
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		for(int i=1;i<=n;i++)
			for(int j=i+1;j<=n;j++) 
				mp[a[i]+a[j]]=make_pair(i,j);//记录下所有的a+b的值
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(i!=j) {
					c=a[i]-a[j];//计算出d-c
					if(mp[c].first!=0) {
						x=mp[c].first;
						y=mp[c].second;
						if(x==i || x==j || y==i || y==j) continue;
						res=max(res,a[i]);//打擂台求出最大的d
					}
				}
		if(res==-INF) printf("no solution\n");
		else printf("%d\n",res);
	}
	return 0;
}
posted @   panxz2009  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示