[Usaco2016 Feb]Circular Barn

Usaco2016 Feb]Circular Barn

Description
农夫约翰建了一个新的圆形牛棚,棚内有沿着圆周隔开的n个小房间,将其按顺时针方向用数字1…n进行编号(3≤n
≤1,000)。其中每个小房间都有门通往棚外和其相邻的两个房间。现在农夫约翰想要把奶牛赶进牛棚,并在每个小
房间都安置ri只奶牛(1≤ri≤100)。他计划打开其中一个房间通往牛棚外部的门,让所有牛从这里进入,并让它们
有序地沿顺时针方向穿过别的房间,直到它们到达合适的安置点。农夫约翰希望选择的这一扇外门能令所有牛行走
的距离总和最小。请算在此情况下的距离总和。(每头牛的行走距离用它所穿过的门的数量来表示)
Input
输入的第一行包含n。接下来的n行每行包含r1…rn。
Output
输出所有牛行走的最小距离总和。
Sample Input
5
4
7
8
6
4
Sample Output
48

题解
此题可以想象成一个圆环,把圆环展开成队列,为了使每一节都枚举到,把1到n-1个数赋值到队列后,再做一个循环,枚举队列头,从第1个到第n个,求出以当前点为门所花费的最少代价。(记住此题为顺时针移动)

代码如下(c++)
#include<bits/stdc++.h>
using namespace std;
int a[10001],n,sum=INT_MAX;
int main()
{
int n,s;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int p;
scanf("%d",&a[i]);
a[i+n]=a[i];
}
for(int i=1;i<=n;i++)
{
int ans=0;
for(int j=i;j<=i+n-1;j++)
ans=ans+a[j]*(j-i);
sum=min(ans,sum);
}
printf("%d",sum);
}

第一篇CDSN,不好请见谅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值