2021牛客多校K题

题意:t个情况

每个情况每w米划一道经线,d米划一道纬线,形成无限多个矩形区域;

给你w和d问走π(就是那个无线不循环小数)米最多能经过多少区域(线上不算区域,经过矩形内部就算占据区域)

思路:

流氓一点,因为π是无限不循环小数,假设他经过的每一个点都会在这个点附近画一个很小很小的圈,就会将四周的区域全部占下来(见下两图)

一种走法是取横竖间距的最小值,这样每经过一个点能加两个区域(第一个点四个)

另一种对角线走法每次能加三个区域(第一个点四个)

于是问题化简为d=min(a,b);c=sqrt(a*a+b*b),x代表走x条最短线,y代表走y条对角线

在dx+cy<=π(x,y为非负整数)的前提下求2x+3y+4的最大值

可以得到最大值至少x<=3或者y<=3(为啥啊为啥啊),枚举x,y就行

(好想知道为啥了,类比一下回退,先全部走直线或者走斜线,然后回退选另一种,求最大值最多回退就是3,所以是3,应该吧。。。)

代码:

#include <bits/stdc++.h>
using namespace std;
#define PI 3.1415926535897
typedef long long ll;
//思路一模一样就是不能过这个问题。。。
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		ll ans = 0;
		double a, b, c, d;
		scanf("%lf %lf", &a, &b);
		c = sqrt(a * a + b * b);
		d = min(a, b);
		//暴力枚举2x+3y的最大值(dx+cy<=PI)
		for (int i = 0; i <= 3; i++)
		{
			if(PI - i * d>0)ans = max(ans, 3 * ll((PI - i * d) / c) + 2 * i);
			if(PI - i * c>0)ans = max(ans, 2 * ll((PI - i * c) / d) + 3 * i);
		}
		printf("%lld\n", ans + 4);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值