摆方格
1000 ms | 内存限制: 65535
难度:2
描述
给你一个n*n的方格,每个方格里的数必须连续摆放如
1 | 2 |
4 | 3 |
,下图为不连续的,请输出从左上角到右下角的对角线上的最大和
1 | 3 |
4 | 2 |
输入包含多组测试数据。
每一行包括一个数据n,表示n*n的方格(保证所有数据在2^64范围内且n>0)
输出
每行输出占一行,输出最大的对角线之和。
样例输入
1
2
3
样例输出
1
6
19
//有点坑啊。。。
刚开始想错了。。想成了下面的了。找完规律已提交就错了。自己还找不到错误。。看了别人的博客才发现自己想的简单了
4 5 6 7 3 14 15 8 2 13 16 9 1 12 11 10
上面的是我开始想的。。。错的(WA)
#include<stdio.h>
#include<string.h>
#include<math.h>
#define ll long long
int main()
{
ll n,m,i,sum;
while(scanf("%lld",&n)!=EOF)
{
sum=0;
for(i=n-1;i>=0;i--)
{
sum+=n;
n+=2*i;
}
printf("%lld\n",sum);
}
return 0;
}
//正确思路是要找到最大的。。()
6 5 4 3 7 12 13 2 8 11 14 1 9 10 15 16
(AC)
#include<stdio.h>
#include<string.h>
int main()
{
long long n,m,i,j,k,sum;
while(scanf("%lld",&n)!=EOF)
{
k=n*n;
sum=0;
for(i=1;i<n;i++)
{
sum+=k;
k-=2;
}
k/=2;
sum+=k;
printf("%lld\n",sum+1);
}
return 0;
}
#include<stdio.h>
int main()
{
long long n;
while(scanf("%lld",&n)!=EOF)
{
if(n&1)
printf("%lld\n",n*n*n-3*n*n/2+2*n-1);
else
printf("%lld\n",n*n*n-3*n*n/2+2*n);
}
return 0;
}