poj2442 Sequenc 优先队列的运用
wa代码 /*priority_queue<int,vector<int>,greater<int> > q[100];
int num,n,m,a;
cin>>num;
while(num--)
{
cin>>m>>n;
for(int i=0; i<m; i++)
{
for(int k=0; k<n; k++)
{
cin>>a;
q[i].push(a);
}
}
int ans=0;
for(int i=0; i<m; i++)
{
ans+=q[i].top();
}
cout<<ans;
if(n>=2)
{
cout<<" ";
int min=100000,k=0,t=n-1;
while(t--)
{
min=100000;
for(int i=0; i<m; i++)
{
int x=q[i].top();
q[i].pop();
int y=q[i].top();
if(y-x<min)
{
min=y-x;
k=i;
}
q[i].push(x);
}
ans-=q[k].top();
q[k].pop();
ans+=q[k].top();
if(t)
cout<<ans<<" ";
else cout<<ans<<endl;
}
}
else cout<<endl;
}
*/
1.先读入第一行a[i],并排序。
2.读入接下来几行,对每一行b[i]进行排序,之后x=a[i]+b[i] 对每一行的每一个都进行相加,并且进入优先队列,如果相加之后是小于优先队列的top()就进队,否则break;
参考http://blog.csdn.net/qq_33362864/article/details/52149360
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <queue>
using namespace std;
const int MAXN=2000+10;
const int inf=0x3f3f3f;
int a[MAXN],b[MAXN],c[MAXN];
int n,m;
void del()
{
int i,j;
priority_queue<int>q;
for(i=0;i<n;++i)//先读入n个元素
{
q.push(a[i]+b[0]);
}
for(i=1;i<n;++i)//维护队列
{
for(j=0;j<n;++j)
{
int x=a[j]+b[i];
if(x<q.top())//如果比最大值还小,就进队,大的出队
{
q.pop();
q.push(x);
}
else break;//否则的话,后面一定都比x大的,所以直接break
}
}
for(i=0;i<n;++i)
{
a[n-1-i]=q.top();//更新a数组
q.pop();
}
}
int main()
{
int t;
int i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
for(j=0;j<n;++j)scanf("%d",&a[j]);
sort(a,a+n);
for(i=1;i<m;++i)
{
for(j=0;j<n;++j)scanf("%d",&b[j]);
sort(b,b+n);
del();
}
for(i=0;i<n-1;++i)printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
return 0;
}