2021牛客暑期多校训练营#8:K-Yet Another Problem About Pi
原题链接:https://ac.nowcoder.com/acm/contest/11259/K
题目大意
在二维平面上,在
x
x
x轴方向上每
w
w
wkm画一条竖线,在
y
y
y轴方向上每
d
d
dkm画一条横线,这些线将平面分割成若干个
w
×
d
w\times d
w×d大小的矩形区域。
求从任意点开始,以任意形式路径形式
π
\pi
πkm,最多可以访问到多少区域。
其中两种方案如下图:
解题思路
当路径存在于边上,可以获得两块区域的收益,而做出的抖动是极小到不需统计的。
我们必须用最小代价得到最大收益,当线蜗居在原点时,可以用忽略不计的极小代价得到绿色的区域:
很明显,走横边和走竖边都可以得到黄色区域,所以只需挑选短一点的边走即可。
此时却有另一种办法:走对角线,而且收益达到了3:
但是消耗却比走边大。此时已经可以枚举得出结论了,但我们秉承这人多跑点机少跑点的信念,继续推啊推·····
设
a
=
m
i
n
(
w
,
d
)
a=min(w,d)
a=min(w,d),
b
=
w
2
+
d
2
b=\sqrt {w^2+d^2}
b=w2+d2,则可得出KaTeX parse error: Expected group after '\frac' at end of input: …leq x\le1\frac),可得出
a
x
+
b
y
≤
π
(
0
≤
x
≤
π
a
,
0
≤
y
≤
π
b
)
(
且
x
,
y
都
为
非
负
整
数
)
ax+by\leq \pi(0\leq x\leq \frac{\pi}{a},0\leq y\leq \frac{\pi}{b})(且x,y都为非负整数)
ax+by≤π(0≤x≤aπ,0≤y≤bπ)(且x,y都为非负整数),则经过的区域数为
3
a
x
+
2
b
y
3ax+2by
3ax+2by。
所以两种方法经过一个区域的代价分别是
a
2
,
b
3
\frac{a}{2},\frac{b}{3}
2a,3b,我们需要通过这个代价计算最优解。
- 若 a 2 < b 3 \frac{a}{2}<\frac{b}{3} 2a<3b,将 2 a x → 3 b y 2ax→3by 2ax→3by得到更优解;
- 若 a 2 > b 3 \frac{a}{2}>\frac{b}{3} 2a>3b,将 3 b y → 2 a x 3by→2ax 3by→2ax得到更优解;
- 若
a
2
=
b
3
\frac{a}{2}=\frac{b}{3}
2a=3b,此时
2
a
x
→
3
b
y
2ax→3by
2ax→3by,两者之间可以互相转换;
所以当 x ≥ 3 x≥ 3 x≥3且 y ≥ 2 y≥ 2 y≥2时,大于这部分的值是可以互相转化且不会影响最终解,所以我们只需要枚举 x < 3 x<3 x<3且 y < 2 y<2 y<2的这部分并寻找最优解即可。
注意: π \pi π只可以用 a c o s ( − 1 ) acos(-1) acos(−1)算出。
代码实现
#include<bits/stdc++.h>
using namespace std;
double w,d,fi,se,pi=acos(-1);
int T,ans;
int main()
{
cin>>T;
while(T--)
{
scanf(" %lf %lf",&w,&d);
fi=min(w,d),se=sqrt(w*w+d*d);
ans=0;
for(int i=0;i<=2;i++){
if(pi-i*fi>0)ans=max(ans,(int)((pi-i*fi)/se)*3+2*i);
if(pi-i*se>0)ans=max(ans,(int)((pi-i*se)/fi)*2+3*i);
}
cout<<ans+4<<endl;
}
}