nssl1258-naive的瓶子【贪心】
生活随笔
收集整理的這篇文章主要介紹了
nssl1258-naive的瓶子【贪心】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目大意
有n個瓶子,將一個瓶子變成相鄰一個瓶子的顏色價值為它們顏色值的乘積,求將所有瓶子變成同一個顏色的最低價值。
解題思路
枚舉最后的剩下的顏色,然后對于每個瓶子只有兩種可能
1.直接變成那個顏色
2.變成別的顏色在變成那個顏色
若我們要將X變成Z,而中間變成Y更優,我們可以判斷
XZ<=XY+ZYXZ<=XY+ZYXZ<=XY+ZY
則Y<=X,Y<=ZY<=X,Y<=ZY<=X,Y<=Z
然后根據根據這個判斷
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ll a[310],f[310],n,maxs,t; ll check(ll x)//判斷 {ll s=0;memcpy(f,a,sizeof(f));for(ll i=1;i<n;i++)//往右合并if(f[i]!=x&&f[i+1]!=x&&f[i]>f[i+1]&&x*f[i+1]+f[i]*f[i+1]<x*f[i]){s+=f[i]*f[i+1];f[i]=f[i+1];}for(ll i=2;i<=n;i++)//往左合并if(f[i]!=x&&f[i-1]!=x&&f[i]>f[i-1]&&x*f[i-1]+f[i-1]*f[i]<x*f[i]){s+=f[i]*f[i-1];f[i]=f[i-1];}for(ll i=1;i<=n;i++)if(f[i]!=x) s+=f[i]*x;return s; } int main() {scanf("%lld",&t);while(t--){scanf("%lld",&n);maxs=1e18;for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);for(ll i=1;i<=n;i++)maxs=min(maxs,check(a[i]));printf("%lld\n",maxs);} }總結
以上是生活随笔為你收集整理的nssl1258-naive的瓶子【贪心】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拆解笔记本电脑光驱电脑光驱如何拆卸
- 下一篇: 路由器里的防火墙怎么设置路由器怎么开启防