“蔚来杯“2022牛客暑期多校训练营4 H题: Task Computing
H题:Wall Builder II
原题链接:https://ac.nowcoder.com/acm/contest/33189/H
题目大意:
有n块宽度为1的砖,n-1块宽度为2的砖…2块宽度为n-1的砖,
1块宽度为n的砖,所有砖的高度为 1;
求他们所能摆出的矩形中最短周长以及每个砖的左下及右上角的坐标。
题解:
首先用num【i】数组存储宽度为i的砖块的个数;
同时计算出总面积S;因为正方形的周长最小,所以所得矩形的长和宽最接近是C最小;
从sqrt(s)开始循环当找到的第一个能整除S的数即 为所求的高;
最后遵循先放宽度大的后放小的的顺序即可求出答案。
参考代码:
#include<bits/stdc++.h>
using namespace std;
int t,num[300],h,l;
const double pi=asin(-1.0)/2.0;
int main()
{
cin>>t;
while(t--)
{
int n,s=0;
cin>>n;
for(int i=1;i<=n;i++)
{
num[i]=n-(i-1);
s+=i*num[i];
}
for(int i=sqrt(s);i>=1;i--)
{
if(s%i==0)
{
h=i;
l=s/i;
break;
}
}
int C=(l+h)*2,nl=0,nh=0,o=(n+1)*n/2;
cout<<C<<"\n";
while(o--)
{
cout<<nl<<" "<<nh<<" ";
for(int i=min(n,(l-nl));i>=1;i--)
{
if(num[i])
{
nl+=i;
num[i]--;
cout<<nl<<" "<<nh+1<<" "<<"\n";
break;
}
}
if(nl==l)
{
nl=0;
nh++;
}
}
}
return 0;
}
``