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 }
需要的地方已在代码的地方注释了