Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4425 Accepted Submission(s): 2698
题解:深搜一下。。。关键要开两个数组;因为自己给下一个一半的时候自己变了,所以再开个数组记录上一状态;
代码:
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<vector> #include<map> #include<algorithm> using namespace std; #define mem(x,y) memset(x,y,sizeof(x)) #define SI(x) scanf("%d",&x) #define SL(x) scanf("%lld",&x) #define PI(x) printf("%d",x) #define PL(x) printf("%lld",x) #define P_ printf(" ") #define T_T while(T--) typedef long long LL; const int INF=0x3f3f3f3f; int N; int m[110],n[110]; int ans; void dfs(int t){ if(ans)return; if(*max_element(m,m+N)==*min_element(m,m+N)){ ans=1; printf("%d %d\n",t,m[0]); return ; } for(int i=1;i<N;i++){ m[i]=(n[i-1]+n[i])/2; if(m[i]&1)m[i]++; // if(m[i]&1)m[i]++; } m[0]=(n[0]+n[N-1])/2; if(m[0]&1)m[0]++; for(int i=0;i<N;i++)n[i]=m[i]; // if(m[0]&1)m[0]++; //for(int i=0;i<N;i++)printf("%d ",m[i]);puts(""); //getchar(); dfs(t+1); } int main(){ while(SI(N),N!=0){ for(int i=0;i<N;i++)scanf("%d",&n[i]),m[i]=n[i]; ans=0; dfs(0); } return 0; }
原文:http://www.cnblogs.com/handsomecui/p/5023595.html