原题链接:http://acm.uestc.edu.cn/problem.php?pid=1655
分析:注意可能会反向。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #define maxn 1005 7 #define inf 0x7fffffff 8 using namespace std; 9 int l[maxn],r[maxn]; 10 int dis1[maxn];//clockwise 11 int dis2[maxn];//ante-clockwise 12 int ans[maxn]; 13 int main() 14 { 15 int T,n,cas=1,d; 16 cin>>T; 17 while(T--) 18 { 19 scanf("%d",&n); 20 for(int i=1;i<=n;i++) 21 { 22 scanf("%d",&d); 23 r[i]=d; 24 if(i>=2)l[i]=r[i-1]; 25 } 26 l[1]=r[n]; 27 for(int i=1;i<=n;i++) 28 ans[i]=inf; 29 int s=1; 30 while(s<=n) 31 { 32 dis1[s]=dis2[s]=0; 33 int temp=0; 34 for(int i=1;i<n;i++) 35 { 36 int j=s+i; 37 if(j>n)j-=n; 38 temp+=l[j]; 39 dis1[j]=temp; 40 } 41 ans[s]=min(ans[s],temp); 42 temp=0; 43 for(int i=1;i<n;i++) 44 { 45 int j=s-i; 46 if(j<=0)j+=n; 47 temp+=r[j]; 48 dis2[j]=temp; 49 } 50 ans[s]=min(ans[s],temp); 51 for(int i=1;i<=n;i++) 52 if(i!=s) 53 { 54 int j=i+1; 55 if(j>n)j-=n; 56 ans[s]=min(ans[s],dis1[i]*2+dis2[j]); 57 j=i-1; 58 if(j<=0)j+=n; 59 ans[s]=min(ans[s],dis2[i]*2+dis1[j]); 60 } 61 s++; 62 } 63 printf("Case #%d:",cas++); 64 for(int i=1;i<=n;i++) 65 printf(" %d",ans[i]); 66 printf(" "); 67 } 68 return 0; 69 }