贪心算法
一、基本思路
1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。
二、代码
代码如下(示例):
#include <bits/stdc++.h>
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 <bits/stdc++.h>
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);
}
}