• 前m大的数


                                        前m大的数
                        Time Limit: 1000 MS Memory Limit: 32768 KB
             64-bit integer IO format: %I64d , %I64u Java class name: Main
    

    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
    Source
    杭电ACM集训队训练赛(VI)

    #include<stdio.h>  
    #include<string.h>  
    #include<algorithm>  
    using namespace std;  
    int a[100000],b[100000];  
    int main()  
    {  
         memset(b,0,sizeof(b));  
        int n,m,i,j,p;  
        while(scanf("%d%d",&n,&m)!=-1)  
        {  
            for(i=0;i<n;i++)  
            {  
                scanf("%d",&a[i]);  
            }  
            for(i=0;i<n;i++)  
            {  
                for(j=i+1;j<n;j++)  
                {  
                    b[a[i]+a[j]]++;//用下标标记两个数之和的个数,相同的和就++。  
                }  
            }  
            for(i=10003;m>0;)//i不要开那么大,否则会wa  
            {  
                if(b[i]&&m>1)  
                {  
                    printf("%d ",i);  
                    m--;  
                    b[i]--;  
                }  
                else if(b[i]&&m==1)//这一步主要是输出完了之后换行  
                {  
                    printf("%d
    ",i);  
                    m--;  
                    b[i]--;  
                }  
                else  
                {  
                    i--;  
                }  
            }  
    
        }  
    }  
    
    
  • 相关阅读:
    扫描与爆破
    复习与PKI技术

    IIS与FTP
    IIS与WEB
    DNS部署与安全
    DHCP服务部署与安全
    文件共享服务CIFS
    NTFS权限
    关于操作运算符的一些小练习
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/7264823.html
Copyright © 2020-2023  润新知