2 条题解

  • 0
    @ 2025-12-30 18:11:55

    此题有点难理解,其实就是一个 n×mn \times m 的格点阵,就像这样(按原题数据 6×66 \times 6 画的):

    ·   ·   ·   ·   ·   ·
    
    ·   ·   ·   ·   ·   ·
    
    ·   ·   ·   ·   ·   ·
    
    ·   ·   ·   ·   ·   ·
    
    ·   ·   ·   ·   ·   ·
    
    ·   ·   ·   ·   ·   ·
    
    

    然后每个格点都要用到,使原图成为一个 n×mn \times m 多边形,就像这样(只列举一种,还有很多):

    ·———·———·———·———·———·
    |                   |
    ·   ·———·———·———·———|
    |   |
    ·   ·———·———·———·———·
    |                   |
    ·   ·———·———·———·———|
    |   |
    ·   ·———·———·———·———·
    |                   |
    ·   ·———·———·———·———|
    //怎么这么像“E”啊?qwq
    

    接着我们就可以使用皮克定理(Pick 定理)来写代码了,可以参照此处。

    AC code:

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
    	int T, n, m;
    	cin >> T;
    	for (int i = 0; i < T; i++) {
    		cin >> n >> m;
    		cout << n * m / 2 - 1 << "." << n * m % 2 * 5 << "00" << endl;
    	}
    	return 0;
    } //总体模仿035966_L3的代码
    
    • 0
      @ 2025-12-28 18:32:52

      Pick 定理:对于一张每个小方格面积为 11 的矩形网格,设某个简单多边形内部有 ii 个格点,边上有 bb 个格点,面积为 SS。若这个多边形的所有顶点都是格点,则有 S=i+0.5b−1S = i + 0.5b - 1。

      注意到所有这样的多边形内部没有格点,边上有 nmnm 个格点,故根据 Pick 定理可知其面积一定为 0.5nm−10.5nm - 1。

      #include <bits/stdc++.h>
      using namespace std;
      int main()
      {
      	int T, n, m;
      	cin >> T;
      	while (T--)
      	{
      		cin >> n >> m;
      		cout << n * m / 2 - 1 << '.' << n * m % 2 * 5 << "00\n";
      	}
      	return 0;
      }
      
      • 1

      信息

      ID
      109
      时间
      1000ms
      内存
      512MiB
      难度
      1
      标签
      递交数
      4
      已通过
      3
      上传者