有时候像这种题,没有明显的思路,感觉像规律题。那么先暴力打表,再找规律就很快了。
题目链接: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;
}