codeforces 578A. A Problem about Polyline(几何,思维,极值)

题目链接 codeforces 578 A

题意:

给出一条折线,线上的点分别为 (0, 0) – (x, x) – (2x, 0) – (3x, x) – (4x, 0) – ... - (2kx, 0) – (2kx + x, x) – ....,输入x, y,问这个点在这条折线上时,X 最小可以是多少

题解

由此可以直接看出,当 x < y 时,不可能出现在折线上,输出-1

                                当x == y 时,X不可能再低,所以X就是 y 值

                                 当x > y 时,由点坐标可以看出,点一定分布在斜率为 1 或斜率为  -1 的直线上,分析直线方程

                                                     y1 = x1 - 2*k1*X     (直线不是固定的,所以k是整数倍,k的范围[0,1,2....],X的范围[y, .... x]);

                                                     y2 = -x1 + 2*k2*X     (直线不是固定的,所以k是整数倍,k的范围[0,1,2....],X的范围[y, .... x]);

                                由方程看出2kX 是常量,所以当k取最大值时,X此时最小, X最小值可以取 y         X>=y

                                     k1 = (y1-x1) / 2 / X              k2 = (y2-x2) / 2 / X            X 取 y

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
   	int x, y;
   	cin >> x >> y;
   	if(x < y){
   		cout << "-1" << endl;
		}
		else if(x == y){
			cout << y << endl;
		}
		else{
			double k1=floor((x-y) / 2 / y );
         double k2=floor((x+y) / 2 / y);
         printf("%.9lf\n",min((x-y)/k1/2,(x+y)/k2/2));

		}
   return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值