卿学姐与魔法
“你的膜法也救不了你”——蛤
在去拯救公主的道路上,卿学姐披荆斩棘,刀刃早已锈迹斑斑。
一日卿学姐正在为武器的问题发愁,碰到了正在赏树的天行廖。
天行廖嘴角微扬,似乎看穿了卿学姐的心思,故意在此等待。
“少年,你渴望掌握雷电的力量吗?”天行廖如是问道。
已经差不多是条咸鱼的卿学姐欣然答应了。于是卿学姐开始跟随魔法大师天行廖学习魔法的力量。
刚入门的卿学姐发现,每个魔法都是由两种基本元素构成的,A元素和B元素。
而每个魔法的魔力是合成这个魔法的A元素和B元素的大小的和。
例如一个大小为3的A元素和一个大小为6的B元素,能构成一个魔力为9的魔法。
现在卿学姐收集了 N 个A元素和 N 个B元素。
敏锐的卿学姐立刻发现他能组合出 N∗N 种魔法。
谦虚的卿学姐并不希望自己太跳,所以他准备将这 N∗N 种魔法中的最小的 N 种展示给天行廖检查。
现在卿学姐想知道,这 N∗N 种魔法中最小的 N 种是什么。
当然,得从小到大输出哦~
题解:学习了
用优先队列 只维护 前n项的排序,看代码把(一开始我也看的懵逼,我觉得要是想尽快的理解一个算法,就是按照代码程序笔算 走一遍,你就会发现慢慢能看懂了)
代码
#include<stdio.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<queue>
#define INF 0x3f3f3f3f
#define MOD 10000009
#define M 100000+1000
#define LL long long
using namespace std;
int A[M];
int B[M];
priority_queue<int>Q; // 优先队列,注意 Q.top() 是队列中的最大数字
int print[M]; // 优先队列默认是由小到大
int main()
{
int n;
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&A[i]);
sort(A,A+n);
for(i=0;i<n;i++)
scanf("%d",&B[i]);
sort(B,B+n);
for(i=0;i<n;i++) //初始化
Q.push(A[0]+B[i]);
for(i=1;i<n;i++)
{
if(A[i]+B[0]>=Q.top()) break; // 截断了好多
for(j=0;j<n;j++)
{
if(A[i]+B[j]<Q.top())
{
Q.pop();
Q.push(A[i]+B[j]);
}
else break; // 之后的值一定是大于前n项的,可以直接断
}
}
for(i=0;i<n;i++)
print[i]=Q.top(),Q.pop();
for(i=n-1;i>=0;i--)
printf("%d\n",print[i]);
return 0;
}