还记得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 // 算法错误.
// 例如:要从序列10,9,9,0,0,0中输出前4大的数,结果应该是10+9,10+9,9+9,10+0
// 而此算法不会输出10+0,而会输出9+0
 #include <stdio.h>
#include <algorithm>
using namespace std;
bool cmp(int a, int b)
{ return a>b; }
int main()
{
int n, m, a[], i, j, k, x1, x2, flag;
while(scanf("%d %d", &n, &m)!=EOF)
{
for(i=;i<n;i++)
scanf("%d", &a[i]);
sort(a,a+n,cmp);
flag=;
for(j=;j<n-;j++)
{
x1=a[j];
for(k=j+;k<n;k++)
{
x2=a[k];
if(x1+x2>=a[j+]+a[j+])
{
flag++;
if(flag==m)
{ printf("%d\n", x1+x2); break; }
else printf("%d ", x1+x2);
}
else break;
}
if(flag==m) break;
}
if(flag!=m) printf("%d\n", a[j]+a[j+]);
}
return ;
}

WA

// 另开了一个数组存所有和,然后对这个数组排序
 #include <stdio.h>

 void shell_sort(int a[], int len)
{
int i,j, gap, t;
for(gap=len/; gap>; gap/=)
for(i=gap; i<len; i++)
for(j=i;j-gap>=&&a[j]>a[j-gap];j-=gap)
{ t=a[j-gap]; a[j-gap]=a[j]; a[j]=t; }
}
int a[],b[];
int main()
{
int n, m, i,j,k;
while(scanf("%d %d", &n, &m)!=EOF)
{
for(i=;i<n;i++)
scanf("%d", &a[i]);
i=;
for(j=;j<n-;j++)
for(k=j+;k<n;k++)
{ b[i]=a[j]+a[k]; i++; }
shell_sort(b,n*(n-)/);
for(i=;i<m-;i++)
printf("%d ",b[i]);
printf("%d\n", b[i]);
}
return ;
}

Time Limit Exceeded

// 另开一个数组,初始所有元素为0. 用下标表示和,值为和的个数.
// 不用排序,直接对数组遍历. 值大于零就输出下标(即和),并统计输出个数.
 #include <stdio.h>
int main()
{
int n, m, a[];
while(scanf("%d %d", &n, &m)!=EOF)
{
int b[]={};
for(int i=;i<n;i++)
scanf("%d", &a[i]);
for(int j=;j<n-;j++)
for(int k=j+;k<n;k++)
b[a[j]+a[k]]++;
int j=, flag=;
for(int i=;;i--)
if(b[i])
{
while(b[i]--)
{
j++;
if(j==m)
{ printf("%d\n", i); flag=; break; }
else printf("%d ", i);
}
if(flag) break;
}
}
return ;
}

AC

4J - 前m大的数的更多相关文章

  1. hdu---(1280)前m大的数(计数排序)

    前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  2. 找出数组前N大的数

    这个题也是个比较有名的面试题.当然有很多变种. 题目意思基本是:从一个数据量很大的数组里找前N大的元素.不允许排序. 这个题有两个比较好的思路: 思路一:用快速排序的思想,是思想,不是要排序; 思路二 ...

  3. HDU 1280 前m大的数

    http://acm.hdu.edu.cn/showproblem.php?pid=1280 前m大的数 Time Limit: 2000/1000 MS (Java/Others) Memory L ...

  4. 输出前n大的数(分治)

    描述:给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输 出. 输入: 第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一 ...

  5. 前m大的数(hdu1280)

    前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  6. 7617:输出前k大的数

    7617:输出前k大的数 查看 提交 统计 提问 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小 ...

  7. 输出前 k 大的数

    总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小 ...

  8. hdu 1280 前m大的数 哈希

    前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  9. 杭电 1280 前m大的数

    http://acm.hdu.edu.cn/showproblem.php?pid=1280 前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memor ...

随机推荐

  1. StarRatingBar星星切换动画《IT蓝豹》

    StarRatingBar星星切换动画 StarRatingBar星星切换动画,很久没有学习一下这个RatingBar了,今天来看看这个RatingBar的动画切换效果,本例子主要是RatingBar ...

  2. Oracle 查询表的字段注释

    SELECT TABLE_NAME, COLUMN_NAME, COMMENTSFROM USER_COL_COMMENTSWHERE TABLE_NAME = 'TB_MENU';

  3. 关于H5唤醒APP的功能实现(千辛万苦啊!)

    首先,我是个后端,写java的,甚至不是搞移动端的,所以js这方面有点底子但不专业,对于出现的错误也请见谅,原来项目要求有个H5页面打开APP的功能就强行要做,没办法就想办法搞一下,网上的教程基本都是 ...

  4. Spring整合EHCache框架

    在Spring中使用缓存可以有效地避免不断地获取相同数据,重复地访问数据库,导致程序性能恶化. 在Spring中已经定义了缓存的CacheManager和Cache接口,只需要实例化便可使用. Spr ...

  5. python远程操作服务器

    python远程控制 标签(空格分隔): 远程Linux python远程控制:方案: Paramiko Pexpect(主要Linux机器) 安装Paramiko pip install param ...

  6. metasploit framework(十五):弱点扫描

    openvas扫描生成NBE格式的日志 改个比较好记的文件名 将日志导入到msf进行后续操作,导入之前查看一下hosts和services 导入nbe格式的文件 查看漏洞弱点 msf直接调用nessu ...

  7. 能判断是电脑端还是手机端的javascript

    <script language="javascript"> //平台.设备和操作系统 var system ={ win : false, mac : false, ...

  8. 虚拟机安装的ubutun全屏

    虚拟机下面安装了ubuntu系统,显示的屏幕只有那么一小块儿,不知道如何才能全屏,那么如何全屏呢?且看下面经验.   方法/步骤     打开虚拟机,并点击要更改成全屏的那个ubuntu系统的电源 我 ...

  9. NumPy Ndarray 对象

    NumPy Ndarray 对象 NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放 ...

  10. Python+Selenium学习--上传文件

    场景 文件上传操作也比较常见功能之一,上传功能操作webdriver 并没有提供对应的方法,关键上传文件的思路.上传过程一般要打开一个系统的window 窗口,从窗口选择本地文件添加.所以,一般会卡在 ...