51NOD 1821 最优集合 [并查集]
题意:
一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i。
给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个数k,要求选择一个S2的子集S3(|S3|<=k),使得S1∪S3的优美值最大。(集合元素可以重复)
n,m≤1000,Q≤1000
比赛时看了一眼题没认真想其实不难....现在想出来(也晚了)
考虑如何求最优值
如果现在最优值为now,只要找到下一个未用的≤now+1的最小元素x,最优值就可以变成now+x
如果找不到怎么办?去S2里找≤now+1的未用的最大元素
实现上可以用一个并查集记录某一个元素的上一个(包括自己)未用元素是谁做到α(m)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const int N=1005; inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int n,a,b,k; struct Set{ int s[N],m; int& operator [](int x){return s[x];} void Sort(){sort(s+1,s+1+m);} }s[N]; int fa[N]; inline int find(int x){return x==fa[x] ? x : fa[x]=find(fa[x]);} void solve(Set &a,Set &b,int k){ //printf("%d ",a.m);for(int i=1;i<=a.m;i++) printf("%d ",a[i]);puts(""); //printf("%d ",b.m);for(int i=1;i<=b.m;i++) printf("%d ",b[i]);puts(""); int n=a.m , m=b.m; for(int i=1;i<=m;i++) fa[i]=i; int now=0,p1=1,p2=1; while(true){//printf("now %d %d %d\n",now,p1,p2); if(p1<=n && a[p1]<=now+1) now+=a[p1++]; else if(k){ k--; while(p2<=m && b[p2]<=now+1) p2++; p2--; if(fa[p2]==p2) fa[p2]=find(p2-1),now+=b[p2++]; else{ int x=find(p2);//printf("x %d\n",x); if(x) fa[x]=find(x-1),now+=b[x]; else break; } }else break; } printf("%d\n",now); } int main(){ freopen("in","r",stdin); n=read(); for(int i=1;i<=n;i++){ s[i].m=read(); for(int j=1;j<=s[i].m;j++) s[i][j]=read(); s[i].Sort(); } int Q=read(); while(Q--){ a=read();b=read();k=read(); solve(s[a],s[b],k); } }
Copyright:http://www.cnblogs.com/candy99/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架