code vs 1245 最小的N个和

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description

有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N^2 个和,求这N^2 个和中最小的 N个。

输入描述 Input Description

第一行输入一个正整数N;第二行N个整数Ai 且Ai≤10^9;第三行N个整数Bi,
且Bi≤10^9

输出描述 Output Description

输出仅一行,包含 n 个整数,从小到大输出这 N个最小的和,相邻数字之间用
空格隔开。

样例输入 Sample Input

5

1 3 2 4 5 
6 3 4 1 7

样例输出 Sample Output

2 3 4 4 5

数据范围及提示 Data Size & Hint

【数据规模】 对于 100%的数据,满足 1≤N≤100000。

思路:优先队列。

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 200001
using namespace std;
int n,num;
int a[MAXN],b[MAXN];
struct nond{
    int x,y;
    bool operator < (nond b) const{
        return x>b.x;
    }
}v;
priority_queue<nond>que;
int main(){
    //freopen("hahaha.in","r",stdin);
    //freopen("hahaha.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        scanf("%d",&b[i]);
        v.x=b[i]+a[1];v.y=1;
        que.push(v);
    }
    while(num<n){
        nond now=que.top();
        cout<<now.x<<endl;
        que.pop();
        now.x=now.x-a[now.y]+a[now.y+1];
        now.y+=1;
        que.push(now);
        num++;
    }
}

 

转载于:https://www.cnblogs.com/cangT-Tlan/p/7605804.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C语言实现建立哈夫曼树并输出的示例代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_LEAF_NODES 100 // 结点结构体 typedef struct Node { int weight; // 权值 int parent, left, right;// 父结点,左子结点,右子结点的下标 } Node; // 获取权值最小的两个结点的下标 void getTwoMinNodes(Node *nodes, int n, int *min1, int *min2) { int i; *min1 = *min2 = -1; for (i = 0; i < n; i++) { if (nodes[i].parent == -1) { if (*min1 == -1 || nodes[i].weight < nodes[*min1].weight) { *min2 = *min1; *min1 = i; } else if (*min2 == -1 || nodes[i].weight < nodes[*min2].weight) { *min2 = i; } } } } // 构建哈夫曼树 void buildHuffmanTree(Node *nodes, int n) { int i, min1, min2; for (i = n; i < 2 * n - 1; i++) { getTwoMinNodes(nodes, i, &min1, &min2); nodes[min1].parent = i; nodes[min2].parent = i; nodes[i].left = min1; nodes[i].right = min2; nodes[i].weight = nodes[min1].weight + nodes[min2].weight; } } // 输出哈夫曼编码 void printHuffmanCode(Node *nodes, int n) { int i, j, parent, cur; char *code = (char *) malloc(n * sizeof(char)); for (i = 0; i < n; i++) { printf("Leaf Node %d: weight=%d, code=", i, nodes[i].weight); parent = nodes[i].parent; cur = i; j = 0; while (parent != -1) { if (nodes[parent].left == cur) { code[j++] = '0'; } else { code[j++] = '1'; } cur = parent; parent = nodes[cur].parent; } while (j > 0) { printf("%c", code[--j]); } printf("\n"); } free(code); } int main() { int n, i; Node nodes[MAX_LEAF_NODES * 2 - 1]; printf("Enter the number of leaf nodes: "); scanf("%d", &n); printf("Enter the weight of each leaf node:\n"); for (i = 0; i < n; i++) { scanf("%d", &nodes[i].weight); nodes[i].parent = -1; nodes[i].left = -1; nodes[i].right = -1; } buildHuffmanTree(nodes, n); printHuffmanCode(nodes, n); return 0; } ``` 输入格式为先输入叶子结点的数量,再输入每个叶子结点的权值,例如: ``` Enter the number of leaf nodes: 5 Enter the weight of each leaf node: 2 3 7 8 10 ``` 输出格式为每个叶子结点的权值和哈夫曼编码,例如: ``` Leaf Node 0: weight=2, code=1111 Leaf Node 1: weight=3, code=1110 Leaf Node 2: weight=7, code=110 Leaf Node 3: weight=8, code=10 Leaf Node 4: weight=10, code=0 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值