hdu 1280 堆排序
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) 
Total Submission(s): 18816    Accepted Submission(s): 6416
Problem Description 
还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小希只想让你把答案中最大的M个数告诉她就可以了。  
给定一个包含N(N<=3000)个正整数的序列,每个数不超过5000,对它们两两相加得到的N*(N-1)/2个和,求出其中前M大的数(M<=1000)并按从大到小的顺序排列。
Input 
输入可能包含多组数据,其中每组数据包括两行:  
第一行两个数N和M,  
第二行N个数,表示该序列。
Output 
对于输入的每组数据,输出M个数,表示结果。输出应当按照从大到小的顺序排列。
Sample Input 
4 4 
1 2 3 4 
4 5 
5 3 6 4
Sample Output 
7 6 5 5 
11 10 9 9 8
在看堆排序 写了个裸的堆排序
TLE 代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[3005],b[3005*1508];
int n,m,t;
void down(int i) {
    int x,flag=0;
    while(i*2<=t&&flag==0) {
        if(b[i*2]>b[i])
            x=i*2;
        else x=i;
        if(i*2+1<=t) {
            if(b[x]<b[i*2+1])
                x=i*2+1;
        }
        if(x!=i) {
            swap(b[x],b[i]);
            i=x;
        }
        else flag=1;
    }
}
void creat() {
    for(int i=t/2;i>=1;i--)
        down(i);
}
void heapsort() {
    while(t>1) {
        swap(b[1],b[t]);
        t--;
        down(1);
    }
}
int main() {
    while(scanf("%d%d",&n,&m)!=EOF) {
        t=0;
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n-1;i++)
            for(int j=i+1;j<=n;j++) {
                b[++t]=a[i]+a[j];
            }
        creat();
        heapsort();
        for(int i=1;i<=m;i++) {
            printf("%d",b[i]);
            if(i!=m) printf(" ");
        }
        printf("\n");
    }
    return 0;
}然后看着 找找模板 优化 优化 优化….
AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[3005],b[3005*1508];
int n,m,t;
void up(int i) {
    int k=i/2;
    if(i==1) return;
    if(b[k]<b[i]) {
        swap(b[i],b[k]);
        up(k);
    }
    return;
}
void down(int i) {
    int x,flag=0;
    while(i*2<=t&&flag==0) {
        if(b[i*2]>b[i])
            x=i*2;
        else x=i;
        if(i*2+1<=t) {
            if(b[x]<b[i*2+1])
                x=i*2+1;
        }
        if(x!=i) {
            swap(b[x],b[i]);
            i=x;
        }
        else flag=1;
    }
}
int pop() {
    int x=b[1];
    swap(b[1],b[t--]);
    down(1);
    return x;
}
void ins(int i) {
    b[++t]=i;
    up(t);
}
int main() {
    while(scanf("%d%d",&n,&m)!=EOF) {
        t=0;
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n-1;i++)
            for(int j=i+1;j<=n;j++) {
                ins(a[j]+a[i]);
            }
        for(int i=1;i<=m;i++) {
            printf("%d",pop());
            if(i!=m) printf(" ");
        }
        printf("\n");
    }
    return 0;
}hdu 1280 堆排序的更多相关文章
- HDU 1280  前m大的数
		http://acm.hdu.edu.cn/showproblem.php?pid=1280 前m大的数 Time Limit: 2000/1000 MS (Java/Others) Memory L ... 
- <hdu - 1280> 前M大的数 (注意其中的细节)
		这是杭电hdu上的链接http://acm.hdu.edu.cn/showproblem.php?pid=1280 Problem Description: 还记得Gardon给小希布置的那个作业么 ... 
- HDU 1280 前m大的数 基数排序
		http://acm.hdu.edu.cn/showproblem.php?pid=1280 题目大意: 给你N(N<=3000)个数(这些数不超过5000),要求输出他们两两相加后和最大的M( ... 
- HDU 1280 前m大的数【哈希入门】
		题意:中文的题目= =将各种组合可能得到的和作为下标,然后因为不同组合得到的和可能是一样的, 所以再用一个数组num[]数组,就可以将相同的和都记录下来 #include<iostream> ... 
- hdu 1280 前m大的数 哈希
		前m大的数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ... 
- HDU 1280 前m大的数【排序 / hash】
		前m大的数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ... 
- HDU 1280 前m大的数(排序,字符串)
		前m大的数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ... 
- hdu 1280 前m大的数(排序)
		题意:排序 思路:排序 #include<iostream> #include<stdio.h> #include<algorithm> using namespa ... 
- Hash算法入门指南(聊点不一样的算法人生)
		前言 很多人到现在为止都总是问我算法该怎么学啊,数据结构好难啊怎么的,学习难度被莫名的夸大了,其实不然.对于一个学计算机相关专业的人都知道,数据结构是大学的一门必修课,数据结构与算法是基础,却常常容易 ... 
随机推荐
- weex npm 报错 cb() never called!
			安装环境:windows7 使用npm 安装 出现错误后网上查找并没有解决,在准备放弃的时候试着用cnpm安装了一下,结果安装成功了,感觉应该网络问题,不知原因但完美解决 
- Java Web(二) Servlet详解
			什么是Servlet? Servlet是运行在Web服务器中的Java程序.Servlet通常通过HTTP(超文本传输协议)接收和响应来自Web客户端的请求.Java Web应用程序中所有的请求-响应 ... 
- day03_python_1124
			01 昨日内容回顾 while 条件: 循环体 如何终止循环: 1,改变条件. 2,break. 3,exit() quit() 不推荐. 关键字: break continue while else ... 
- ural1517
			题解: 后缀数组 求一下最长公共字串 代码: #include<cstdio> #include<cmath> #include<algorithm> #inclu ... 
- HTML编辑笔记1
			1.编写html ①新建一个记事本(以.html结尾) ②右击选择打开方式为文档 ③编写内容 ④用浏览器查看内容 2.html编写格式 <html> <head></he ... 
- leetcode python 003
			## 给定一个字符串,求其最长无重复的子字符串##给定“abcabcbb”,答案是“abc”,长度为3.##给定“bbbbb”,答案是“b”,长度为1.##鉴于“pwwkew”,答案是“wke”,长度 ... 
- VS2010编译Unigine_2010源码
			VS2010编译Unigine_2010源码[Debug版本] 1.Laucher工程属性改为控制台项目 2.Unigine工程编译时的Warnning LNK2019 a.属性--常规-目标文件名改 ... 
- html页面技巧
			Query获取Select选择的Text和Value: 语法解释: 1. $("#select_id").change(function(){//code...}); //为S ... 
- fastIO
			文件系统除了处理正常的IRP 之外,还要处理所谓的FastIo.FastIo是Cache Manager 调用所引发的一种没有irp 的请求.换句话说,除了正常的Dispatch Functions ... 
- java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 解决方法
			1.导入mysql-connector-java-5.1.26-bin.jar包,我试着把maven中自动下载下来的mysql-connector-java-5.1.26.jar包导入,还是没能解决问 ... 
