P2241 统计方形(数据加强版)

https://www.luogu.com.cn/problem/P2241

方法一:暴力(30分)分少总比0分强,其他测试点都显示TLE

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int n, m, ans_zfx=0, ans_cfx=0;
 7     int x, y, chang, kuan, xx, yy;
 8     cin>>n>>m;
 9     for(x=1; x<=n; x++)                             //枚举每个矩形的左上坐标点x 
10         for(y=1; y<=m; y++){                        //枚举每个矩形的左上坐标点y 
11             for(chang=1; chang<=n; chang++)
12                 for(kuan=1; kuan<=m; kuan++){      //枚举可以累加的长度
13                     xx=x+chang; yy=y+kuan;         //枚举可以累加的宽度
14                     if(xx<=n+1 && yy<=m+1){        //判断矩形右下角点坐标是否合法 
15                         if(chang==kuan)ans_zfx++;  //判断是正方形还是长方形 
16                         else ans_cfx++;
17                     }
18                 }        
19         }
20     cout<<ans_zfx<<" "<<ans_cfx;
21     return 0;
22  } 

当然暴力枚举也可以通过枚举两个点的坐标来计算是正方形还是长方形,结果也是一样的,因为四重循环嵌套,时间复杂度是(O(n^4)=5000^4,所以会TLE)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int n, m, ans_zfx=0, ans_cfx=0;
 7     int x, y, chang, kuan, xx, yy;
 8     cin>>n>>m;
 9     for(x=1; x<=n; x++)                             //枚举每个矩形的左上坐标点x 
10         for(y=1; y<=m; y++){                        //枚举每个矩形的左上坐标点y 
11             for(xx=x+1; xx<=n+1; xx++)               //举每个矩形的右下坐标点xx
12                 for(yy=y+1; yy<=m+1; yy++){          //枚举每个矩形的右下坐标点yy  
13                     chang=xx-x; kuan=yy-y;           //计算两个坐标点形成的矩形长和宽  
14                     if(chang<=n && kuan<=m){        //判断矩形是否合法 
15                         if(chang==kuan)ans_zfx++;   //判断是正方形还是长方形 
16                         else ans_cfx++;
17                     }
18                 }        
19         }
20     cout<<ans_zfx<<" "<<ans_cfx;
21     return 0;
22  } 

 方法二:不超时就得去找规律,用数学的方法来总结,看洛谷题解,非常详细!

posted @ 2020-07-14 10:57  TFLSNOI  阅读(324)  评论(0编辑  收藏  举报