贪心算法


贪心算法
  • 一、基本思路
  • 二、代码

  • 一、基本思路

    1.建立数学模型来描述问题。
    2.把求解的问题分成若干个子问题。
    3.对每一子问题求解,得到子问题的局部最优解。
    4.把子问题的解局部最优解合成原来解问题的一个解。

    二、代码

    代码如下(示例):

    #include 
    using namespace std;
    long long a[2000010];
    int main()
    {
        int t;
        scanf("%d",&t);
        while (t--)
        {
            long long n,m,k;
            scanf("%lld%lld%lld",&n,&m,&k);
            for (int i = 1; i <= m; i++)
            {
                scanf("%lld",&a[i]);
            }
            sort(a+1,a+m+1);
            long long dis=0;
            for (int i = 2; i <= m; i++)
            {
                dis+=abs(a[i]-k)*2;
            }
            if (a[1]>k)
                dis+=2*(a[1]-k)+2*(k-1);
            else
                dis+=2*(k-1);
            printf("%lld\n",dis);
        }    
    }
    

    代码如下(示例):

    #include 
    using namespace std;
    int main()
    {
        int t;
        cin>>t;
        while (t--)
        {
            int n;
            cin>>n;
            priority_queue<int,vector<int>,greater<int>>q;
            while (n--)
            {
                int a;
                cin>>a;
                q.push(a);
            }
            int sum=0;
            int b,c;
            while (!q.empty())
            {
                b=q.top();
                q.pop();
                if (q.empty())
                    break;
                c=q.top();
                sum+=b+c;
                q.pop();
                q.push(b+c);
            }       
            printf("%d\n",sum);
        }  
    }
    
    ACM