洛谷题目
一开始无脑是这样写的,还是很费劲。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int main(){
cin>>n>>m;
int c1=n*m;
int t=min(n,m);
for(int len=1;len<=t-1;len++){
for(int i=1;i+len<=n;i++){
for(int j=1;j+len<=m;j++){
c1++;
}
}
}
int c2=0;
for(int len=0;len<=n-1;len++){
for(int len1=0;len1<=m-1;len1++){
if(len!=len1){
for(int i=1;i+len<=n;i++){
for(int j=1;j+len1<=m;j++){
c2++;
}
}
}
}
}
cout<<c1<<" "<<c2;
}
遍历长度,正方形的len相等,长方形的len不等,四重循环。
一看规模,三重都超时了。
看题解可以去到两重循环。
下面是参考大佬的题解。
长为2,宽为1的长方形,横向排列有m*(n-1)个,纵向排列有n*(m-1)个,长方形长度不等,所以个数为(n-a)*(m-b),a,b不相同
长和宽为1的正方形,如图有(n-1)*(m-1)个,个数有(n-a)*(m-1)个,a,b相等。
#include<bits/stdc++.h>
using namespace std;
long long n,m,c1,c2;
int main(){
cin>>n>>m;
c1=0;
c2=0;
for(int a=0;a<n;a++){
for(int b=0;b<m;b++){
if(a==b){
c1+=(n-a)*(m-b);
}else{
c2+=(n-a)*(m-b);
}
}
}
cout<<c1<<" "<<c2;
}
还要注意总和可能超过int的最大值,因此把总和设置为long。
编程了两年,两年也没有停止学习过,到头来连个暴力枚举都这么费劲,还超时了,应该怎么办呢,只能硬着头皮写下去了。