码迷,mamicode.com
首页 > 其他好文 > 详细

SICAU-OJ: 要我唱几首歌才能够将你捕捉

时间:2018-12-10 22:36:18      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:div   最小   str   不可   bre   lse   back   nbsp   ali   

要我唱几首歌才能够将你捕捉

题意:

有N种颜色的牛,现在可以执行以下两种操作:

1.抓捕一只牛,代价为ai; 2.花费x的代价使用魔法,让所有颜色加1,N会变为1。

求得到N种颜色的牛最少花费的代价。

 

题解:

这题挺巧妙的,我一开始想的是贪心,找到每头牛最好从哪头牛更新过来,后来就WA了很多次...因为对施用魔法的情况不能很好地处理。

其实这题可以想:每种颜色的产生都需要一开始选取一头牛,并且经过X次魔法操作(0<=X<=N-1)才行,这里是关键。

根据上面,我们可以得知对于两种颜色i,j,假定他们分别从a,b转移过来,那么通过max(j-b,i-a)次魔法操作肯定可以从a,b转移到i,j。

假定我们现在最多使用k次魔法并且已经得知了每种颜色从哪个位置转移过来,那么现在肯定使用k次魔法可以得到目前的最小结果(可以模拟一下,有些转移我们并不一定需要把k次魔法用完,但有些可能就需要,这样的话就能对施用魔法的情况进行一个好的处理了)。

所以我们可以枚举使用魔法的次数(限定之)为k,我们每头牛最多就只能从[i-k,i]中ai的最小值更新过来,最后统计结果就好了。

这里不可能存在这种情况:相同位置的牛用相同的魔法次数。所以可以保证贪心策略的正确性。

 

代码如下:

#include <bits/stdc++.h>
#define INF 9999999999999
using namespace std;
typedef long long ll;
const int N = 20005;
ll n,x;
ll a[N],pos[N],vis[N];
vector <ll> vec;
long long dp[N];
int main(){
    scanf("%I64d%I64d",&n,&x);
    for(int i=1;i<=n;i++) scanf("%I64d",&a[i]),dp[i]=INF;
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            int len = i+n-j;
            if(a[j]+len*x<dp[i]){
                dp[i]=a[j]+len*x;
                pos[i]=j;
            }
        }
        for(int j=1;j<=i;j++){
            if(a[j]+(j-i)*x<dp[i]){
                dp[i]=a[j]+(i-j)*x;
                pos[i]=j;
            }
        }
    }
    for(int i=1;i<=n;i++) if(!vis[pos[i]]){
        vec.push_back(pos[i]);
        vis[pos[i]]=1;
    }
    int len = vec.size();
    int num=n-vec[len-1];
    for(int i=1;i<=n&&i!=vec[len-1];i++){
        if(pos[i]==vec[len-1]){
            num++;
        }else break ;
    }
    int ans = 0;
    for(int i=0;i<len-1;i++){
        int d=vec[i+1]-vec[i]-1;
        ans+=(a[vec[i]]+x)*d+a[vec[i]];
    }
    ans+=((a[vec[len-1]]+x)*num)+a[vec[len-1]];
    cout<<ans;
    return 0;
}

 

SICAU-OJ: 要我唱几首歌才能够将你捕捉

标签:div   最小   str   不可   bre   lse   back   nbsp   ali   

原文地址:https://www.cnblogs.com/heyuhhh/p/10099526.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!