牛客练习赛113--小红的数组操作(最短路)

题目描述

小红拿到了一个数组,她可以进行若干次以下操作:

1.选择一个元素,花费p,使其加x。
1.选择一个元素,花费q,使其减y。

小红希望若干次操作后,数组的平均数是一个整数。你能帮小红求出最小的总代价吗?

输入描述

第一行输入五个正整数n,p,x,q,y,n代表数组的大小,其余几个变量如题目描述所示。 第二行输入n个正整数ai​,代表数组的元素。 1≤n≤10^5 1≤ai,x,y,p,q≤10^9

输出描述

如果无解,请输出-1。 否则输出一个整数,代表最小的总代价。

输入1

3 3 1 5 6
2 3 4

输出1

0

输入2

5 5 2 4 3
2 3 2 2 2

输出2

8

解析:需要平均数是整数,相当于是sum%n==0,可以转化为最短路问题,也就是求模n余数是0的最短路,对于u,可以到u+x,边权是p,可以到u-y,边权是q,因此我们对于加减u加减需要之后模n,最后答案就是dist[0]。

注意:需要开long long,对于u衍生的两点分别是((u+x)%n+n)%n,((u-y)%n+n)%n

#include 
using namespace std;
const int N=1e5+5;
typedef long long ll;
ll a[N],dist[N];
ll n,p,x,q,y,sum;
void bfs(ll k)
{
    queue qq;
    qq.push(k);
    for(int i=0;i<=n;i++) dist[i]=0x3f3f3f3f3f3f3f3f;
    dist[k]=0;
    while(qq.size())
    {
        ll u=qq.front();//当前u
        qq.pop();
        ll a=((u+x)%n+n)%n,w1=p;//到a,边权是w1
        ll b=((u-y)%n+n)%n,w2=q;//到b,边权是w2
        if(dist[u]+w1

你可能感兴趣的:(算法,c++,c语言)