摆方格
时间限制: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的平方那个数字不在顶角位置。对角线上n-1个数字与n的平方成等差数列,顶角最小的那个值由对角线一侧的空格数来推算,也是根据空格构成等差数列来求,当然要去掉那些穿插的较大的数的个数(n-1)/2。#include<stdio.h> #define LL long long int main(){ LL n,a,b,ans; while(scanf("%lld",&n)!=EOF){ a=n*(n-1)/2-(n-1)/2+1; //求顶角不构成等差数列那个数 b=(n*n-(n-2))*(n-1); //对角线构成等差数列的和 ans=a+b; printf("%lld ",ans); } return 0; }
以n=4为例。对角线上,16的位置不是在右上角,而是留了一个顶角位置,12、14、16构成了等差数列。6可以由对角线左侧的空格个数来求得,即n*(n-1)/2为对角线左侧的空格个数,而由于会有13等较大的数的穿插,所以(n-1)/2即为所穿插的较大数的个数(可以写几组找下规律)。