转的别人的http://blog.csdn.net/u012349696/article/details/399266
摆 方格
时间限制:
1000 ms | 内存限制:
65535 KB 难度:2
- 描述
给你一个n*n的方格,每个方格里的数必须连续摆放如
1
2
4
3
,下图为不连续的,请输出从左上角到右下角的对角线上的最大和
1
3
4
2
- 输入
- 输入包含多组测试数据。
每一行包括一个数据n,表示n*n的方格(保证所有数据在2^64范围内且n>0)
- 输出
- 每行输出占一行,输出最大的对角线之和。
- 样例输入
123
- 样例输出
1619
- 上传者
分析:n=1 1 n=2 1 2
斜对角线=2+4=6
4 3
n=3
18 9
27 6
3 4 5
斜对角线=9 + 7+3 n=4
9 10 15 16
斜对角线=16 + 14 +12+6 =48 规律 n*n+n*n-2+n*n-4+(n*n-4)/2;
8 11 14 1
7 12 13 2
6 5 4 3 公式法:
[cpp]
view plain
copy
- #include<stdio.h>
- int main(){
- long long n,m,i,j;
- while(~scanf(“%lld”,&n))
- {
- long long k=n-1,M=n*n;
- printf(“%l64d\n”,k*M-k*(k-1)+n*n/2-n+2);
- }
- return 0;
- }
模拟过程法:
[cpp]
view plain
copy
- #include<iostream>
- #include<string.h>
- #include<algorithm>
- #include<cstdio>
- using namespace std;
- int main()
- {
- long long n;
- while(cin>>n)
- {
- long long k=n*n;
- long long sum=0;
- for(int i=0; i<n-1; i++)
- {
- sum+=k;
- k-=2;
- }
- k/=2;
- sum+=k;
- cout<<sum+1<<endl;
- }
- return 0;
- }
#include<iostream> using namespace std; int main() { long long n,m; while(cin>>n) { long long k=n-1,M=n*n; cout<<k*M-k*(k-1)+n*n/2-n+2<<endl; } }