牛客寒假算法基礎集訓營6(H-肥豬)(暴力)
阿新 • • 發佈:2019-02-03
cond 接下來 prev http 成本 rst cst test HERE
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
在這個異世界,共有n種肥豬,編號分別為1,...,n。
小B希望集齊這n種肥豬。
召集肥豬有兩種方式:
1. 花費a[i]的金幣召喚一只編號為i的肥豬。
2. 花費x的金幣使所有已召集的肥豬進化。
即編號為i的肥豬編號變成i+1,特殊的,編號為n的肥豬編號變成1。
請問小B最少要花多少金幣才能集齊n種肥豬。
鏈接:https://ac.nowcoder.com/acm/contest/332/H
來源:牛客網
空間限制: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
備註:
1≤n≤2000,1≤x,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 #definesz(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-肥豬)(暴力)