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程序题,其他半点前端都没有,都是考算法,计算机原理,数据结构.下面贴上腾讯笔试最后三大条中的一条,实现一个蛇形矩阵的输出.蛇形矩阵的什么样这里我 ...
随机推荐
- Http最常见的错误代码
1XX 表示消息 2XX 表示成功 3XX 表示重定向 4XX 表示请求错误 5XX 表示服务器端错误 我们最常见的就是: 404(页面找不到),这个错误代码是由于我们输入的网址不对造成的,浏览器找不 ...
- Mycat 配置说明(server.xml)
server.xml 几乎保存了所有mycat需要的系统配置信息,包括 mycat 用户管理.DML权限管理等,其在代码内直接的映射类为SystemConfig 类. user 标签 该标签主要用于定 ...
- POJ 1979 DFS
题目链接:http://poj.org/problem?id=1979 #include<cstring> #include<iostream> using namespace ...
- Konckout开发实例:简单的表单提交页面
<!doctype html> <html > <head> <meta http-equiv="Content-Type" conten ...
- 测试驱动开发实践2————从testList开始
内容指引 1.测试之前 2.改造dto层代码 3.改造dao层代码 4.改造service.impl层的list方法 5.通过testList驱动domain领域类的修改 一.测试之前 在" ...
- Notepad++使用vs2015主题教程
前言: 最近几天都在用Notepad++,所以想换个看得舒服点的主题. 发现vs2015的主题颜色特别好看.所以就查了一下有没有大佬做了这样的Notepad++主题. 结果是有的. 正文: notep ...
- 福州大学W班-alpha冲刺评分
作业链接 https://edu.cnblogs.com/campus/fzu/FZUSoftwareEngineering1715W/homework/1159 作业要求 1.前期准备 阅读学习&l ...
- Python 实现队列
操作 Queue() 创建一个空的队列 enqueue(item) 往队列中添加一个item元素 dequeue() 从队列头部删除一个元素 is_empty() 判断一个队列是否为空 size() ...
- scrapy 数据存储mysql
#spider.pyfrom scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Ru ...
- find命令之(-atime,-ctime,-mtime)
关于find命令,以拙见总结如下: >>>定义: find命令用来在指定目录下查找文件. 任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则fin ...