1 条题解

  • 1
    @ 2024-3-30 0:07:52

    【2021年省赛B组】试题C: 直线

    题解

    在平面直角坐标系中,两点确定一条直线,但两点有四个坐标值,我们不太好维护四个坐标值是否重复。 我们知道直线的表示方法中,除了俩点式,还有点斜式,点斜式的话,一个点两个坐标值和一个斜率值,三个值来确定唯一性,虽然不太好写,但是还是能勉强能跑出来。

    更进一步,如果那个点是在xx轴或者yy轴上,那么一个坐标就恒定为0,只要维护另一个坐标值(其实就是截距)和斜率就好了,简单mapmap维护一下,要考虑枚举的斜率不存在的情况。

    • 最终答案为:40257

    提交代码

    #include<bits/stdc++.h>
    #define EPS 1e-8
    void solve()
    {
    	int n = 20;
    	int m = 21;
    	std::map<std::pair<double, double>, int> mp;
    	std::map<std::array<double, 4>, int> vis;
        int ans = n + m;
        std::vector<std::pair<double, double>> res;
    	for(double x1 = 0; x1 < n; x1++)
    	{
    		for(double y1 = 0; y1 < m; y1++)
    		{
    			for(double x2 = 0; x2 < n; x2++)
    			{
    				for(double y2 = 0; y2 < m; y2++)
    				{
    					if(x1 != x2 && y1 != y2) 
                        {
                            double k = 1.0 * (y1 - y2) / (x1 - x2);
                            double b = y1 - x1 * k;
                            if(mp[{k, b}] == 0)
                            {
                                mp[{k, b}] = 1;
                                res.push_back({k, b});
                                ans++;
                            }
                        }
    				}
    			}
    		}
    	}
    	std::sort(res.begin(), res.end());
    	
    	for(int i = 0; i < res.size() - 1; i++)
    	{
    		if(fabs(res[i].first - res[i +1].first) < EPS && fabs(res[i].second - res[i + 1].second) < EPS)
    		{
    			ans--;
    		}
    	}
    	
    	std::cout << ans << "\n";
    }
    signed main()
    {
    	std::ios::sync_with_stdio(false);
    	std::cin.tie(0);
    	int t = 1;
    	while(t--) solve();
    	return 0;
    }
    
    • 1

    信息

    ID
    978
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    61
    已通过
    20
    上传者