Sequence POJ - 2442
如果行号影响了复制,请点击代码框左上角的按钮。
口胡一个结论:就是前i行产生的最小的n个和,一定可以在"前i-1行产生的最小n个和,每一个加上这一行的任意一个数,产生的n2个数"中找到。(其实显然是对的)
因此每次只需要求两个有n个数的序列每个序列中选一个产生的所有和中最小n个。方法就是先将两个序列排序,这之后去模拟一个一个取出和的过程。如果第一个序列取的已经确定,那么第二个序列一定是按顺序取。因此枚举第一个序列中取某一个,对于第一个序列中取某一个的情况维护当前已经取到的第二个序列中的序号。用优先队列维护最小的和,每次取出一个放进当前答案的数组,并将该和对应的第一个序列取法对应的第二个序列的序号加一并放回优先队列。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 using namespace std; 6 typedef int LL; 7 typedef pair<LL,LL> P; 8 typedef pair<LL,P> P2; 9 priority_queue<P2,vector<P2>,greater<P2> > qq; 10 LL a[105][2005]; 11 LL t[2005]; 12 LL T,sum,m,n; 13 int main() 14 { 15 P2 x; 16 LL i,j; 17 scanf("%d",&T); 18 while(T--) 19 { 20 memset(a,0,sizeof(a)); 21 memset(t,0,sizeof(t)); 22 scanf("%d%d",&m,&n); 23 for(i=1;i<=m;i++) 24 { 25 for(j=1;j<=n;j++) 26 scanf("%d",&a[i][j]); 27 sort(a[i]+1,a[i]+n+1); 28 } 29 for(i=2;i<=m;i++) 30 { 31 while(!qq.empty()) qq.pop(); 32 for(j=1;j<=n;j++) 33 qq.push(P2(a[i-1][j]+a[i][1],P(j,1))); 34 for(j=1;j<=n;j++) 35 { 36 x=qq.top(); 37 qq.pop(); 38 t[j]=x.first; 39 qq.push(P2(a[i-1][x.second.first]+a[i][x.second.second+1],P(x.second.first,x.second.second+1))); 40 } 41 memcpy(a[i],t,sizeof(t)); 42 } 43 for(i=1;i<=n;i++) 44 printf("%d ",a[m][i]); 45 puts(""); 46 } 47 return 0; 48 }
分类:
贪心
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)