矩形的个数
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3*1的矩形和1个3*2的矩形,总共18个矩形。
给出A,B,计算可以从中找到多少个矩形。
-
输入
-
本题有多组输入数据(<10000),你必须处理到EOF为止
输入2个整数A,B(1<=A,B<=1000)
输出
-
输出找到的矩形数。
样例输入
-
1 2 3 2
样例输出
-
3 18
来源
- FOJ月赛-2007年3月 上传者
问题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=206
问题分析:
刚开始的思路是根据6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3*1的矩形和1个3*2的矩形这样找规律,但没找到。为什么没找到呢。。。。
之后上网上查,发现了另一个分析的思路:
首先当只有1行b列:
然后再加入一行,分析此时的矩形个数,本身加入的一行会有m=b+(b-1)+...+1。然后再加入的一行和之前加入的每一行都会又形成新的矩形,即每一个小矩形和之前的每一行的相对相同位置的矩形又产生一个,第i行加入后,和前i-1行的每一行都产生m个新的组合起来的矩形。
代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <vector> #include <queue> #include <stack> #include <map> #include <string> #include <algorithm> #include <iomanip> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char** argv) { /*freopen("file/input.txt","r",stdin); freopen("file/output.txt","w",stdout);*/ int a,b; while(scanf("%d%d",&a,&b)!=EOF){ long long m=0,sum=0; for(int i=1;i<=b;i++){ m+=i; } for(int i=1;i<=a;i++){ sum+=m*i; } printf("%lld\n",sum); } return 0; }
优秀代码:1.
#include <stdio.h>
2.
main(){
float
a,b;
while
(
scanf
(
"%f%f"
,&a,&b)+1)
printf
(
"%.0f\n"
,(a+1)*a*(b+1)*b/4);}
代码分析:也可直接由公式得出 (a+1)*a*(b+1)*b/4)。注意一点 1<=A,B<=1000,当累乘时候会超出int的范围。sum+=m*i; m本身是1到a-1的累加,m>=10000,m*1+m*2+m*3+...+m*b,所以非常可能超过int。所以sum用long来。
-
本题有多组输入数据(<10000),你必须处理到EOF为止