EOJ3536 求蛇形矩阵每一行的和---找规律
题目链接:
https://acm.ecnu.edu.cn/problem/3536/
题目大意:
求蛇形矩阵的每一行的和,数据范围n<=200000。
思路:
由于n数据较大,所以感觉应该是需要找规律。
先附上蛇形矩阵的打表代码,先输出数据较小的蛇形矩阵,观察规律。
#include <iostream>
#include <malloc.h>
using namespace std;
int arr[][];
int startNum=;
void DrawCircle(int len,int n);
int main(){
int i,j,k,n,len;
cout<<"请输入蛇形矩阵阶数n\nn=";
cin>>n;
len=n;
if(n%!=){
while(len>){
DrawCircle(len,n);
len=len-;
}
arr[n/+][n/+]=n*n;
}
else{
while(len>){
DrawCircle(len,n);
len=len-;
}
}
cout<<"对应的蛇形矩阵如下"<<endl;
for(i=;i<=n;i++){
for(j=;j<=n;j++){
cout<<arr[i][j];
if(j<n){
if(arr[i][j]>=)
cout<<" ";
else
cout<<" ";
}
else
cout<<endl;
}
}
for(int i = ; i <= n; i++)
{
int tot = ;
for(int j = ; j <= n; j++)tot += arr[i][j];
cout<<tot<<endl;
}
return ;
}
void DrawCircle(int len,int n){
int i,number,row,col;
number=(n-len)/+;//当前画的是第几个圈
row=number;col=number;
for(i=;i<=len;i++){
arr[row][col]=startNum++;
col++;
}
col--;//for循环要跳出时候,列数多加了一次,这个地方减掉
for(i=;i<=len-;i++){
row++;
arr[row][col]=startNum++;
}
for(i=;i<=len-;i++){
col--;
arr[row][col]=startNum++;
}
for(i=;i<=len-;i++){
row--;
arr[row][col]=startNum++;
}
}
举个例子,先观察n = 9的时候。
对应的蛇形矩阵如下
1 2 3 4 5 6 7 8 9
32 33 34 35 36 37 38 39 10
31 56 57 58 59 60 61 40 11
30 55 72 73 74 75 62 41 12
29 54 71 80 81 76 63 42 13
28 53 70 79 78 77 64 43 14
27 52 69 68 67 66 65 44 15
26 51 50 49 48 47 46 45 16
25 24 23 22 21 20 19 18 17
第一行的和是S1 = 9*10/2=45。
第二行前8位比第一行多,第9位多1,S2 = 31*+1+S1=294
第三行第2位到第7位比第二行多, 第1位少1,后1位多1正好抵消,第8位多1,所以S3 = 23*+1+S2=433
第四行第3位到第6位比第三行多, 前2位少1,后2位多1正好抵消,第7位多1,所以S4 = 15*+1+S3=494
第五行第4位到第5位比第三行多, 前3位少1,后3位多1正好抵消,第6位多1,所以S5 = 7*+1+S4=509
这是上面的前半部分的规律,从a = 4 * n - 5(4*9-5=31), b = n - 1(9-1=8)开始,a依次减,b依次减
第六行比第五行前4位少1, 后4位多1,中间位少,S6 = S5-1*3=506
第七行比第六行前3位少1, 后3位多1,中间位少, S7 = S6 - 3*11=473
第八行比第七行前2位少1, 后2位多1,中间位少, S8 = S7 - 5*19=378
第九行比第八行前1位少1, 后1位多1,中间位少, S9 = S8 - 7*27=189
后半部分的规律是从a = 3, b = 1开始,a依次加8, b依次加2
以上是n为奇数的规律,偶数的规律也类似:
以n = 6为例:
对应的蛇形矩阵如下
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
前三行的规律和上面一样,
S1 = 6 * 7 / 2 = 21
S2 = * + 1 + S1=117
S3 = * + 1 + S2=151
后三行的规律是
S4 = S3 + 4
S5 = S4 - *
S6 = S5 - *
多找几组偶数会发现每次都是这样的规律,后半部分的第一行 = 前半部分的最后一行 + 4,然后的规律都是依次减去a*b,a最开始为2,b最开始为7,之后依次a+=2,b+=8.
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<map>
#include<stack>
#include<vector>
#include<list>
#include<deque>
#include<sstream>
#include<cctype>
#define REP(i, n) for(int i = 0; i < (n); i++)
#define FOR(i, s, t) for(int i = (s); i < (t); i++)
#define MEM(a, x) memset(a, x, sizeof(a));
#define DEBUG(x) cout<<x<<endl;
#define DBG cout<<"----------------"<<endl;
#define mid(x, y) x + (y - x)/ 2
#define lc o<<1
#define rc o<<1|1
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> Pair;
const int maxn = 1e6 + ;
const double eps = 1e-;
const int INF = 1e9;
const int dir[][] = {,,,,,-,-,};
const double pi = 3.1415926535898;
ll T, n, m, cases;
int main()
{
std::ios::sync_with_stdio(false);
cin >> n;
if(n & )//奇数的时候
{
ll a1 = (n + ) * n / ;//求出第一行
cout<<a1<<endl;
ll a = * n - , b = n - ;//a,b初始值
int i;
for(i = ; i <= (n + ) / ; i++)//前半部分输出
{
a1 = a1 + + a * b;
a -= ;
b -= ;
cout<<a1<<endl;
}
a = , b = ;
for(;i <= n; i++)//后半部分输出
{
a1 = a1 - a * b;
cout<<a1<<endl;
a += ;
b += ;
}
}
else//n为偶数
{
ll a1 = (n + ) * n / ;//输出第一个
cout<<a1<<endl;
ll a = * n - , b = n - ;
int i;
for(i = ; i <= (n + ) / ; i++)//前半部分和之前一样的规律
{
a1 = a1 + + a * b;
a -= ;
b -= ;
cout<<a1<<endl;
}
a1 += ;
cout<<a1<<endl;//中间的特殊规律
a = , b = ;
i++;//这里i++保证输出正好n行
for(;i <= n; i++)//后半部分输出
{
a1 = a1 - a * b;
a += ;
b += ;
cout<<a1<<endl;
}
}
return ;
}
注意坑点:最好所有的变量设成long long,如果n是int的话,计算a1 = (n + 1) * n / 2;的时候会溢出,导致出错。
EOJ3536 求蛇形矩阵每一行的和---找规律的更多相关文章
- Nowcoder 练习赛 17 C 操作数 ( k次前缀和、矩阵快速幂打表找规律、组合数 )
题目链接 题意 : 给定长度为n的数组a,定义一次操作为: 1. 算出长度为n的数组s,使得si= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007: 2. ...
- Nowcoder 北师校赛 B 外挂使用拒绝 ( k次前缀和、矩阵快速幂打表找规律、组合数 )
题目链接 题意 : 中文题.点链接 分析 : 有道题是问你不断求前缀和后的结果 Click here 这道题问的是逆过程 分析方法雷同.可参考 Click here ----------------- ...
- 2018年东北农业大学春季校赛 B wyh的矩阵【找规律】
链接:https://www.nowcoder.com/acm/contest/93/B来源:牛客网 题目描述 给你一个n*n矩阵,按照顺序填入1到n*n的数,例如n=5,该矩阵如下 1 2 3 4 ...
- 夏令营501-511NOIP训练17——蛇形矩阵
传送门:QAQQAQ 题意:话说小X在孩提时,都会做标准的蛇形矩阵了,发现很好玩.现在的小X很想对其进行改版,变为如下类型的一个无限大蛇形数阵:令S(x)表示以1为左上角,x为右下角的矩形内所有数之和 ...
- 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185
Milking Grid Problem's Link:http://poj.org/problem?id=2185 Mean: 给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最 ...
- wikioi 1160 蛇形矩阵
/*======================================================================== 1160 蛇形矩阵 题目描述 Descriptio ...
- EOJ 3.30 B. 蛇形矩阵【找规律/待补】
[链接]:https://acm.ecnu.edu.cn/contest/59/problem/B/ B. 蛇形矩阵 Time limit per test: 2.0 seconds Memory l ...
- ACM_蛇形矩阵
蛇行矩阵 Time Limit: 4000/2000ms (Java/Others) Problem Description: 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形. Input: ...
- js实现蛇形矩阵
参加腾讯前端实习生笔试,真的是被虐了千百遍,除了一条js程序题,其他半点前端都没有,都是考算法,计算机原理,数据结构.下面贴上腾讯笔试最后三大条中的一条,实现一个蛇形矩阵的输出.蛇形矩阵的什么样这里我 ...
随机推荐
- 冒泡排序及优化(Java实现)
向大端冒泡 public class BubbleSort { public static <T extends Comparable<? super T>> void sor ...
- 1.使用dom4j解析XML文件
一.dom4j的简介 dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它 ...
- 基于hi-nginx的web开发(python篇)——路由装饰器
现在,有了起步的基本认识,现在需要一个可以媲美flask或者bottle的简洁易用的路由功能,可以用装饰器写法任意映射 URLs 到代码. 这个,并不难.首先,来一个叫做hi的模块:hi.py: im ...
- Redis学习笔记(三)常用命令整理
Redis 常用命令 1.DEL key 删除key2.EXISTS key 检查key是否存在3.KEYS * 查看所有的key4.EXPIRE key seconds 设置key的过期时间5.TT ...
- .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧
一.前言 为什么要调试代码?通过调试可以让我们了解代码运行过程中的代码执行信息,比如变量的值等等.通常调试代码是为了方便我们发现代码中的bug.ken.io觉得熟练代码调试技巧是成为合格程序员的基本要 ...
- Matlab绘图基础——axis设置坐标轴取值范围
peaks; axis tight %Set the axis limits to equal the range of the data axis square axis 'auto x' % ...
- node.js应用脚手架:koa2、sequelize、mysql
自制了一个 nodejs 应用的脚手架. 基于 koa2 的,所以需要保证 node 环境至少为 7.6.0 吸取了以前的踩坑教训,添加了守护进程,确保应用不会因为异常导致网站直接挂掉(使用了 for ...
- HTTP协议----URI,URL,持久连接,管道与Cookie
URI与URL有什么不同呢? URI:Universal Resource Identifier统一资源标志符 URL:Universal Resource Locator统一资源定位器 URI是用来 ...
- Linux下的/etc/hosts文件
在Unix系统下面有一个/etc/hosts文件,在我的Mac上,这个文件的内容如下: ## # Host Database # # localhost is used to configure th ...
- 【分布式系列之dubbo】dubbo管理工具dubbo-admin安装使用
一.安装完成后界面显示 二.安装 1.下载dubbo-admin安装包 2.修改WEB-INF下的dubbo.properties文件内容 dubbo.registry.address=zookeep ...