1. 程式人生 > >牛客寒假算法基礎集訓營6(H-肥豬)(暴力)

牛客寒假算法基礎集訓營6(H-肥豬)(暴力)

cond 接下來 prev http 成本 rst cst test HERE

鏈接:https://ac.nowcoder.com/acm/contest/332/H
來源:牛客網

肥豬 時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld

題目描述

小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 10
1
20

輸出

復制
12
示例2

輸入

復制
4 10
1
2
3
4

輸出

復制
10

備註:

1n2000,1x,a[i]109

思路:
由題目可知,我們最多使用N次進化技能。
那麽
我們可以定義兩個數組,
數組a代表不用進化技能的第i個豬需要的成本。
數組b代表使用了至多i個技能(或許沒用),獲得每頭豬的代價,我們可以這樣表示b[(j+i-1)%n+1] 代表至多使用了i個技能,獲得第j個豬的代價。
然後我們枚舉使用了1~n次進化,求出最小的代價即可,
細節見代碼:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#define rt return
#define
sz(a) int(a.size()) #define all(a) a.begin(), a.end() #define rep(i,x,n) for(int i=x;i<n;i++) #define repd(i,x,n) for(int i=x;i<=n;i++) #define pii pair<int,int> #define pll pair<long long ,long long> #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define MS0(X) memset((X), 0, sizeof((X))) #define MSC0(X) memset((X), ‘\0‘, sizeof((X))) #define pb push_back #define mp make_pair #define fi first #define se second #define eps 1e-6 #define gg(x) getInt(&x) #define db(x) cout<<"== [ "<<x<<" ] =="<<endl; using namespace std; typedef long long ll; ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} ll lcm(ll a,ll b){return a/gcd(a,b)*b;} ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;} inline void getInt(int* p); const int maxn=1000010; const int inf=0x3f3f3f3f; /*** TEMPLATE CODE * * STARTS HERE ***/ ll a[maxn]; ll b[maxn]; ll n,x; int main() { gbtb; cin>>n>>x; ll ans,sum; ans=0ll; repd(i,1,n) { cin>>a[i]; b[i]=a[i]; ans+=a[i]; } sum=ans; repd(i,1,n) { repd(j,1,n) { if(b[(j+i-1)%n+1]>a[j]) { sum-=(b[(j+i-1)%n+1]-a[j]); b[(j+i-1)%n+1]=a[j]; } } ans=min(ans,sum+1ll*i*x); } cout<<ans<<endl; return 0; } inline void getInt(int* p) { char ch; do { ch = getchar(); } while (ch == || ch == \n); if (ch == -) { *p = -(getchar() - 0); while ((ch = getchar()) >= 0 && ch <= 9) { *p = *p * 10 - ch + 0; } } else { *p = ch - 0; while ((ch = getchar()) >= 0 && ch <= 9) { *p = *p * 10 + ch - 0; } } }

 

牛客寒假算法基礎集訓營6(H-肥豬)(暴力)