牛客寒假算法基础集训营6 H-肥猪
2019-02-07 18:55
141 查看
牛客寒假算法基础集训营6 H-肥猪
链接:https://ac.nowcoder.com/acm/contest/332/H
来源:牛客网
题目描述
小B来到了一个异世界,成为了肥猪之王。
在这个异世界,共有n种肥猪,编号分别为1,…,n。
小B希望集齐这n种肥猪。
召集肥猪有两种方式:
- 花费a[i]的金币召唤一只编号为i的肥猪。
- 花费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); }
相关文章推荐
- 牛客寒假算法基础集训营4 F(二分+拓扑判环)
- 牛客寒假算法基础集训营1B题
- 牛客寒假算法基础集训营2 处女座的测验(一)质数
- 牛客寒假算法基础集训营3
- 牛客寒假算法基础集训营1 小a与黄金街道 (欧拉函数,欧拉降幂)
- 牛客寒假算法基础集训营2 解题报告
- 牛客寒假算法基础集训营 Day4-B Applese 走方格(dfs)
- 牛客寒假算法基础集训营1---小a与黄金街道( 欧拉函数)
- 牛客寒假算法基础集训营1 B 小a与"204"
- 牛客寒假算法基础集训营1 小a与星际探索
- 19牛客寒假算法基础集训营1小结
- 牛客寒假算法基础集训营2 B处女座与cf (模拟)
- 牛客寒假算法基础集训营1-小a与"204"
- 19牛客寒假算法基础集训营2小结
- 牛客寒假算法基础集训营3 java
- 牛客寒假算法基础集训营1 小a与黄金街道
- 牛客寒假算法基础集训营1【题解】
- 牛客寒假算法基础集训营1 解题报告
- 牛客寒假算法基础集训营2 处女座与复读机
- 牛客寒假算法基础集训营1 小a的排列