Sequence POJ - 2442
2024-08-30 19:11:47
口胡一个结论:就是前i行产生的最小的n个和,一定可以在"前i-1行产生的最小n个和,每一个加上这一行的任意一个数,产生的n2个数"中找到。(其实显然是对的)
因此每次只需要求两个有n个数的序列每个序列中选一个产生的所有和中最小n个。方法就是先将两个序列排序,这之后去模拟一个一个取出和的过程。如果第一个序列取的已经确定,那么第二个序列一定是按顺序取。因此枚举第一个序列中取某一个,对于第一个序列中取某一个的情况维护当前已经取到的第二个序列中的序号。用优先队列维护最小的和,每次取出一个放进当前答案的数组,并将该和对应的第一个序列取法对应的第二个序列的序号加一并放回优先队列。
错误原因:
1.44行写成t[i],会被只有一行的数据卡掉
2.求两行合并的时候用了n2算法,太暴力
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef int LL;
typedef pair<LL,LL> P;
typedef pair<LL,P> P2;
priority_queue<P2,vector<P2>,greater<P2> > qq;
LL a[][];
LL t[];
LL T,sum,m,n;
int main()
{
P2 x;
LL i,j;
scanf("%d",&T);
while(T--)
{
memset(a,,sizeof(a));
memset(t,,sizeof(t));
scanf("%d%d",&m,&n);
for(i=;i<=m;i++)
{
for(j=;j<=n;j++)
scanf("%d",&a[i][j]);
sort(a[i]+,a[i]+n+);
}
for(i=;i<=m;i++)
{
while(!qq.empty()) qq.pop();
for(j=;j<=n;j++)
qq.push(P2(a[i-][j]+a[i][],P(j,)));
for(j=;j<=n;j++)
{
x=qq.top();
qq.pop();
t[j]=x.first;
qq.push(P2(a[i-][x.second.first]+a[i][x.second.second+],P(x.second.first,x.second.second+)));
}
memcpy(a[i],t,sizeof(t));
}
for(i=;i<=n;i++)
printf("%d ",a[m][i]);
puts("");
}
return ;
}
最新文章
- 正定矩阵(positive definite matrix)
- 洛谷U4859matrix[单调栈]
- C# 文件及文件夹深度复制
- 简单尝试利用vultr vps自架PPTP上网用于工作学习需要
- 【引】runtime全解析,P1:Programming Guide
- 对InvokeAction简略分析了解验证失败为什么Action还会继续执行
- JPA学习(6)JPQL
- linux命令篇
- 【转】iOS开发拓展篇—静态库
- php对数组排序代码
- Linq XML
- Linux学习之Center os网络配置
- python基础学习笔记4--抽象
- Windows Azure 网站 (WAWS) 和中间证书
- sql最简单的查询语句
- django 学习之model操作(想细化)
- bzoj1193 马步距离
- NOIP 2002提高组 选数 dfs/暴力
- 在javascript中NodeList和Array的区别及转换方法
- MFC clist 学习设计
热门文章
- Android点击Button水波纹效果
- 当Eclipse爱上SVN
- Linux 命令 sudo
- C#调用国家气象局天气预报接口
- input from 表单提交 使用 属性 disabled=&;quot;disabled&;quot; 后台接收不到name=&;quot;username&;quot;的值
- 点滴记录——Ubuntu 14.04中Chrome浏览器标题栏出现中文乱码
- Evaluate Reverse Polish Notation --leetcode
- SSH三大框架整合配置详细步骤(1)
- 汉诺塔算法c++源代码(递归与非递归)[转]
- Ubuntu 12.10安装vmware-tools