hdu4350

刚开始我被这道题吓到了,心想这要移动这么多次,这不是要超时吗,后来又感觉是约瑟夫问题,唉,想起约瑟夫问题就想起了那个难记的公式,唉,直接放弃了,后来才发现,这道题原来是这么的easy,水题

思路:

认真观察即可发现,这道题是有规律的,不会让你去循环这么多次,拿个简单的的例子试下,你会发现,当移动r(题目中给的数)次时,数组又回到了原来的样子,所以可直接循环n%r次、

 1 #include <iostream>
 2 
 3 using namespace std;
 4 int a[55];
 5 int tmp[55];
 6 int main()
 7 {
 8     int Case;
 9     cin>>Case;
10     int i,n,l,r,j,k,index;
11     int num=1;
12     while(Case--)
13     {
14         for(i=1;i<=52;i++)
15         {
16             cin>>a[i];
17         }
18         cin>>n>>l>>r;
19         n=n%r;
20         for(i=1;i<=n;i++)
21         {
22             int count=1;
23             for(j=l;j<=r;j++)
24             {
25                 tmp[count++]=a[j];
26             }
27             index=l-1;
28             for(k=r;k>r-l+1;k--)//这里有可能馋死你覆盖,所以要从最后一个开始赋值
29             {
30                 a[k]=a[index--];
31             }
32             for(j=1;j<=r-l+1;j++)
33             {
34                 a[j]=tmp[j];
35             }
36         }
37         cout<<"Case #"<<num++<<": ";
38         for(i=1;i<=52;i++)
39         {
40             if(i<=51)
41             cout<<a[i]<<" ";
42             else cout<<a[i];
43         }
44         cout<<endl;
45     }
46     return 0;
47 }

需要的地方已在代码的地方注释了

posted on 2012-08-09 18:19  矮人狙击手!  阅读(256)  评论(0编辑  收藏  举报

导航