标签:alice and bob playing a game zoj 3789 abs problem zoj
有时候像这种题,没有明显的思路,感觉像规律题。那么先暴力打表,再找规律就很快了。
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3798
先上我的暴力打表,这种肯定是TLE的,只用它发现规律就好了。
#include<cstdio> #include<cstring> #include<algorithm> #define INF 0x3f3f3f3f #define N 100 using namespace std; int f[N]; int mi[N],ma[N]; int cal(int n) { int p=1; for(int i=1;i<=n;i++) p*=i; return p; } int main() { int n; while(scanf("%d",&n)==1) { for(int i=1;i<=n;i++) f[i]=i; int k=cal(n),Min=INF,Max=-INF; for(int i=0;i<k;i++) { int b; next_permutation(f+1,f+n+1); for(int i=1;i<=n;i++) { if(i==1) b=f[i]; else b=abs(b-f[i]); } if(b<=Min) { Min=b; for(int i=1;i<=n;i++) mi[i]=f[i]; } if(b>=Max) { Max=b; for(int i=1;i<=n;i++) ma[i]=f[i]; } } printf("%d %d\n",Min,Max); for(int i=1;i<=n;i++) printf("%d ",mi[i]); puts(""); for(int i=1;i<=n;i++) printf("%d ",ma[i]); puts(""); } return 0; }
多输入几个N,就能发现,逆序得到最小的,把逆序中最大的n放到最后就能得到最大的。
故简单题,水之~
#include<cstdio> #include<algorithm> #define N 50000+5 using namespace std; int f[N]; int main() { int n; while(scanf("%d",&n)==1) { for(int i=1;i<=n;i++) f[i]=i; int Min=0,Max=0; for(int i=n;i>0;i--) Min=abs(Min-f[i]); for(int i=n-1;i>0;i--) Max=abs(Max-f[i]); Max=abs(Max-f[n]); printf("%d %d\n",Min,Max); for(int i=n;i>1;i--) printf("%d ",f[i]); printf("%d\n",f[1]); for(int i=n-1;i>0;i--) printf("%d ",f[i]); printf("%d\n",f[n]); } return 0; }
标签:alice and bob playing a game zoj 3789 abs problem zoj
原文地址:http://blog.csdn.net/darwin_/article/details/39033785