您的位置:首页 > 其它

牛客寒假算法基础集训营6 H-肥猪

2019-02-07 18:55 141 查看

牛客寒假算法基础集训营6 H-肥猪

链接:https://ac.nowcoder.com/acm/contest/332/H
来源:牛客网

题目描述
小B来到了一个异世界,成为了肥猪之王。
在这个异世界,共有n种肥猪,编号分别为1,…,n。
小B希望集齐这n种肥猪。
召集肥猪有两种方式:

  1. 花费a[i]的金币召唤一只编号为i的肥猪。
  2. 花费x的金币使所有已召集的肥猪进化。
    即编号为i的肥猪编号变成i+1,特殊的,编号为n的肥猪编号变成1。

请问小B最少要花多少金币才能集齐n种肥猪。
输入描述:
第一行两个正整数n,x
接下来n行,第i行一个正整数a[i]
输出描述:
一个数表示答案

示例1
输入

2 101
20

输出

12

示例2
输入

4 101
2
3
4

输出

10

备注:
1≤n≤2000,1≤x,a[i]≤109

题意:
你需要收集n种猪,每一种猪i都有一个花费a[i]。你现在有两种操作方式,第一种,直接用a[i]的花费收集猪i,第二种,你可以将所有的猪的花费换一个序号,将i变成i+1,第n只猪就变成1,你可以进行若干次操作,使得你收集完所有的猪后,花费最少
题解:
这题只要枚举所有的状态找最小的搭配就行了,对于方式2,你最多可以用n-1次,因为用n次就又变成初始状态了,用dp可做
dp[i][j]表示用i次2操作,第j个位置的花费,枚举即可。
状态转移方程:dp[i][j]=min(dp[0][j],dp[i-1][(j-1+n)%n]),dp[0][j]是初始状态,就是我最开始就可以收集这种猪,或者在前次2操作的基础上,再操作依次2操作。
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=2e3+10;
ll dp[maxn][maxn];
ll n,x;
int main(){
ll ans=0;
scanf("%lld %lld",&n,&x);
for(ll i=0; i<n; i++){
scanf("%lld",&dp[0][i]);
ans+=dp[0][i];
}
for(ll i=1; i<n; i++){//枚举使用2方案的次数
ll tmp=i*x;
for(ll j=0; j<n; j++){
dp[i][j]=min(dp[0][j],dp[i-1][((j-1)+n)%n]);
tmp+=dp[i][j];
}
ans=min(ans,tmp);
}
printf("%lld\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: