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

链接: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';
        }
    }
}
 

猜你喜欢

转载自www.cnblogs.com/qieqiemin/p/10349289.html