欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

统计方格区域内正方形和长方形的个数(洛谷P1548题题解,Java语言描述)

程序员文章站 2022-07-13 13:47:03
...

题目要求

P1548题目要求

统计方格区域内正方形和长方形的个数(洛谷P1548题题解,Java语言描述)
统计方格区域内正方形和长方形的个数(洛谷P1548题题解,Java语言描述)

分析

这题,一看就懵,因为一看就需要推公式,很麻烦……

此时发现本题是洛谷红题哈哈哈,还没“高性能”标签,那就暴力吧!!!

注意只要区域是正方形就不是长方形(此题的长方形不包含正方形诶),就可以if…else…
计个数就好啦。

但明显可以O(1)的公式秒题,公式是啥呢,这是推理步骤(别人写的,我没推):
统计方格区域内正方形和长方形的个数(洛谷P1548题题解,Java语言描述)

据此得到的C++代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
int main()
{
    cin>>n>>m;
    int nn=min(n,m);
    int z=m*n*(nn+1)+nn*(nn+1)*(2*nn+1)/6-(m+n)*nn*(nn+1)/2;
    int c=n*(n+1)/2*m*(m+1)/2-z;
    cout<<z<<" "<<c<<endl;
}

(反正我也没跑过这个代码)

AC代码(Java语言描述)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int y = scanner.nextInt(), x = scanner.nextInt();
        scanner.close();
        int square = 0, rectangle = 0;
        for (int i = 0; i <= x; i++) {
            for (int j = 0; j <= y; j++) {
                for (int k = i+1; k <= x; k++) {
                    for (int l = j+1; l <= y; l++) {
                        if (k-i == l-j) {
                            square++;
                        } else {
                            rectangle++;
                        }
                    }
                }
            }
        }
        System.out.println(square + " " + rectangle);
    }
}

暴力求解它不香吗