题意:给你n个长度为ai的布,开始时布的颜色为白色,每次可以选择一种颜色的前x个布与剩下的进行染色,染成不同的颜色,求将所有布都染成不一样的颜色的最小花费是多少(染色长度最小是多少)
题解:这个问题可以转化为有n个布都各有不同的颜色,每次可以选两种不一样的颜色进行染色,最少花费多少可以将所有布染成一样的颜色,于是这题就很简单了!首先将所有布放入优先队列中,每次取最小的两个布,将它合为一块布,然后再放入优先队列中,直到只剩下一块、
AC代码:
#include<stdio.h>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
priority_queue<ll,vector<ll>,greater<ll> >que;
int main()
{
ll T;
scanf("%lld",&T);
while(T--)
{
while(!que.empty())que.pop();
ll n;
scanf("%lld",&n);
for(ll i=0;i<n;i++)
{
ll k;
scanf("%lld",&k);
que.push(k);
}
ll ans=0;
for(ll i=0;i<n-1;i++)
{
ll sum=0;
sum+=que.top();
que.pop();
sum+=que.top();
que.pop();
ans+=sum;
que.push(sum);
}
printf("%lld\n",ans);
}
}