1 条题解

  • 1
    @ 2024-11-11 9:15:00

    观察样例图片可以看得出来组成一个矩形需要四个A,顺时针方向来看,B和C是交替分布的,所以不难想B和C的数量相等,然后根据bcd的关系,遍历所有可能情况的长,二分查找这种情况下最大的宽。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    void sjl()
    {
    	int a, b , c, d;
    	cin >> a >> b >> c >> d;
    	int ans = 0;
    	if(a < 4)//无法组成矩形
    	{
    		ans = 0;
    	}
    	else
    	{
    		for(int i = min(b, c); i >= 0; i --)//边长最长应该是b/2+c/2但bc数量相等
    		{//遍历长,二分查找满足情况的最长的宽
    			int l = 0, r = min(b, c);
    			while(l <= r)
    			{
    				int mid = (l + r) / 2;
    				if(i * mid <= d)//此时长乘宽就是中间需要被d填充的面积
    				{
    					if(b >= i + mid && c >= i + mid)//确保bc数量满足情况
    					{
    						ans = max(ans ,(2 + i) * (2 + mid));//满足情况就维护一次答案
    					}
    					l = mid + 1;
    				}
    				else
    				{
    					r = mid - 1;
    				}
    			}
    		}
    	}
    	cout << ans <<"\n";
    }
    signed main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0),cout.tie(0);
    	int T_ = 1;
    	cin >> T_;
    	while(T_ --)
    	{
    		sjl();
    	}
    	return 0;
    }
    

    信息

    ID
    1059
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    34
    已通过
    3
    上传者