摆方格
时间限制:1000 ms | 内存限制:65535 KB
难度:2
描述
给你一个n*n的方格,每个方格里的数必须连续摆放如
1 | 2 |
4 | 3 |
,下图为不连续的,请输出从左上角到右下角的对角线上的最大和
1 | 3 |
4 | 2 |
输入
输入包含多组测试数据。
每一行包括一个数据n,表示n*n的方格(保证所有数据在2^64范围内且n>0)
输出
每行输出占一行,输出最大的对角线之和。
样例输入
1 2 3
样例输出
1 6 19
个人理解:(找规律)
n=1 1 sum=1
n=2 1 2
4 3 sum=4+2(4/2)
n=3 1 2 3
8 7 4
9 6 5 sum=9+7+3(7/2)
n=4 16 15 10 9
1 14 11 8
2 13 12 7
3 4 5 6 sum=16+14+12+6(12/2)
规律为:sum=n*n + n*n-2 + n*n-2*2+……+ n*n-2*(n-2)+最后一个数/2
即sum=等差数列(n-1)项之和+最后一项/2
运行结果:
代码:
此为自己根据规律所写
#include<stdio.h>
int main()
{
long long n;
while(scanf("%lld",&n)!=EOF)
{
long long i,j,k,sum;
k=n*n;
sum=0;
for(i=0;i<n-1;i++)
{
sum+=k;
k-=2;
}
k+=2;
k/=2;
sum+=k;
printf("%lld\n",sum);
}
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;
}
两种代码运行结果根据先后顺序在上面截图显示