当前位置: 首页 > news >正文

【题解】P1548 [NOIP 1997 普及组] 棋盘问题

题目背景

NOIP1997 普及组第一题

题目描述

设有一个 N×MN \times MN×M 方格的棋盘 (1≤N≤100,1≤M≤100)(1≤N≤100,1≤M≤100)(1N100,1M100)

求出该棋盘中包含有多少个正方形、多少个长方形(不包括正方形)。

例如:当 N=2,M=3N=2, M=3N=2,M=3 时:

正方形的个数有 888 个:即边长为 111 的正方形有 666 个;边长为 222 的正方形有 222 个。

长方形的个数有 101010 个:

  • 2×12 \times 12×1 的长方形有 444 个:

  • 1×21 \times 21×2 的长方形有 333 个:

  • 3×13 \times 13×1 的长方形有 222 个:

  • 3×23 \times 23×2 的长方形有 111 个:

输入格式

一行两个整数 N,MN,MN,M

输出格式

一行两个整数,表示正方形的个数与长方形的个数。

输入输出样例 #1

输入 #1

2 3

输出 #1

8 10

题目分析

题目需要我们统计n×mn\times mn×m 方格的棋盘中正方形、长方形(不包括正方形)的个数。

可以考虑枚举所有可能的长、宽,相等为正方形,剩余的就是长方形。整体时间复杂度为O(nm)O(nm)O(nm)

也可以考虑优化一下,枚举所有可能的正方形边长,根据边长计算对应的正方形个数。对于长方形个数,则可以通过总数减去正方形个数进行获取。

对于边长为x(1≤x≤min⁡(n,m))x(1\le x \le \min(n,m))x(1xmin(n,m))的正方形,个数为 (n−x+1)×(m−x+1)(n-x+1)\times (m-x+1)(nx+1)×(mx+1)

对于矩形可以视为由水平、垂直两个方向各选两条线构成的图形。n×mn\times mn×m 方格的棋盘,长宽各有 n+1n+1n+1m+1m+1m+1条线,故矩形总数为 Cn+12×Cm+12C_{n+1}^2 \times C_{m+1}^2Cn+12×Cm+12(n+1)×n2×(m+1)×m2\frac{(n+1)\times n}{2}\times \frac{(m+1)\times m}{2}2(n+1)×n×2(m+1)×m

利用数学性质,整体复杂度可以降为 O(n)O(n)O(n)

代码实现

复杂度O(nm)写法

#include<iostream>
using namespace std;
int m,n,cnt1,cnt2;    
int main(){cin>>m>>n;           for(int i=0;i<=m;i++){for(int j=0;j<=n;j++){for(int k=i+1;k<=m;k++){for(int l=j+1;l<=n;l++){if(k-i==l-j){//如果长和宽相等,及正方形 cnt1++;	}else{//不相等就是长方形 cnt2++;	} } }}}   cout<<cnt1<<" "<<cnt2;  return 0;	        	    
}

复杂度O(n)写法

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int N = 1e5 + 5;
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int n,m;int sum1=0,sum2=0;cin>>n>>m;for(int i=1;i<=min(n,m);i++){sum1+=(n-i+1)*(m-i+1);}sum2=(n*(n+1)/2)*(m*(m+1)/2)-sum1;cout<<sum1<<" "<<sum2;return 0;
}
http://www.dtcms.com/a/390016.html

相关文章:

  • scala中for推导式详细讲解
  • React学习 ---- 基础知识学习
  • C语言实现MATLAB中的Fir1带通滤波器
  • 微信小程序开发教程(十七)
  • 9月18日星期四今日早报简报微语报早读
  • SqlSugar 问题记录
  • 记一次宝塔+nginx+php8+thinkphp8多应用下某个应用报错404的问题 - nginx、php日志全无 - 无法追踪
  • Windows Server远程桌面(RDP)安全优化
  • 工具链过于分散会导致哪些问题
  • 【RAG】Youtu-GraphRAG
  • 惠普LaserJet Pro M203dn黑白激光打印机双面卡纸维修一例
  • 专题二 二叉树中的深度优先搜索
  • Git 多人协作(1)
  • 设计模式第三章(迭代器模式)
  • 网络原理(4):HTTP协议 -- HTTP请求 -- 首行(请求方法)
  • 密钥下发服务中心:双重验证 + 实时监控的轻量级密钥管理解决方案
  • 硬件 - RK3588部分(4) - 原理图 - RK806
  • Sass开发【三】
  • 百度之星2025(第二场)
  • Ovis-U1:阿里巴巴推出的统一的多模态理解与生成模型
  • 深入剖析C++智能指针:unique_ptr与shared_ptr的资源管理哲学
  • 创建索引失败,表一直查询不了
  • 知识分享:网线和DB9正确接线方法
  • 【算法笔记】前缀树
  • 让ai完成原神调酒 试做
  • 第十四届蓝桥杯青少组C++选拔赛[2022.11.27]第二部分编程题(2、拼写单词)
  • 私有化部署UE像素流后,通过实时云渲染平台配置网络端口,实现云推流内网及公网访问
  • Day 05 Geant4多线程 Multithreading --------以B1为例
  • 【word解析】从 Word 提取数学公式并渲染到 Web 页面的完整指南
  • FreeRTOS 队列机制详解:阻塞、唤醒与任务同步