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,不好请见谅。