UESTC--1655

原题链接: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("\n");    
67     }
68     return 0;
69 }
View Code

 

posted @ 2013-09-08 18:40  EtheGreat  阅读(128)  评论(0编辑  收藏  举报