zoukankan      html  css  js  c++  java
  • Sequence(priority_queue)

    这题很智慧。

    VJ上4000多ms

    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include <stdio.h>
    #include <vector>
    using namespace std;
    int main()
    {
        int T,n,m,sum;
        int a[2005];
        scanf("%d",&T);
        while(T--)
        {
            priority_queue<int ,vector<int>, greater<int> >q;
            priority_queue<int ,vector<int>, less<int> >p;
            scanf("%d%d",&n,&m);
            for(int i=0; i<m; i++)
            {
                scanf("%d",&a[i]);
                q.push(a[i]);
            }
            for(int i=1; i<n; i++)
            {
                for(int j=0; j<m; j++)
                    scanf("%d",&a[j]);
                while(!q.empty())
                {
                    sum=q.top();
                    q.pop();
                    for(int j=0; j<m; j++)
                    {
                        if(p.size()==m&&p.top()>sum+a[j])
                        {
                            p.pop();
                            p.push(sum+a[j]);
                        }
                        else if(p.size()<m)
                        {
                            p.push(sum+a[j]);
                        }
                    }
                }
                while(!p.empty())
                {
                    sum=p.top();
                    p.pop();
                    q.push(sum);
                }
            }
            int flag=0;
            while(!q.empty())
            {
                sum=q.top();
                q.pop();
                if(flag==1)
                {
                    printf(" %d",sum);
                }
                else
                {
                    printf("%d",sum);
                    flag=1;
                }
            }
            printf("
    ");
        }
        return 0;
    }

    大神的代码(VJ上才刚900ms)

    #include <iostream>
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    #include<set>
    #include<string>
    using namespace std;
    int main()
    {
        priority_queue<int,vector<int>,less<int> >p;
        int n,m,i,j,a[2011],b[2011],t,k;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            for(i=0; i<m; i++)
                scanf("%d",&a[i]);
            sort(a,a+m);
            for(k=1; k<n; k++)
            {
                for(i=0; i<m; i++)
                {
                    scanf("%d",&b[i]);
                    p.push(a[0]+b[i]);
                }
                sort(b,b+m);
                for(i=1; i<m; i++)
                {
                    for(j=0; j<m; j++)
                    {
                        if(a[i]+b[j]>p.top())
                            break;
                        p.pop();
                        p.push(a[i]+b[j]);
                    }
                }
                for(i=0; i<m; i++)
                {
                    a[m-i-1]=p.top();
                    p.pop();
                }
            }
            for(i=0; i<m-1; i++)
                printf("%d ",a[i]);
            printf("%d
    ",a[m-1]);
        }
    }
  • 相关阅读:
    【纪中集训2019.3.19】原样输出
    【纪中集训2019.3.11】树上四次求和
    【纪中集训2019.3.11】Cubelia
    【纪中集训2019.3.14】小凯的疑惑
    leetcode 18 4Sum
    leetcode 17 Letter Combinations of a Phone Number
    leetcode 11 Container With Most Water
    leetcode 16 3Sum Closest
    leetcode 15 3Sum
    leetcode 14 Longest Common Prefix
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/3894504.html
Copyright © 2011-2022 走看看