CodeForces 579C A Problem about Polyline[数学]

本文介绍了一种通过给定点坐标,求解特定折线中最小x值的算法实现过程,包括方程式推导、取整处理及最小值计算等关键步骤。算法最终输出经过给定点的折线中最小的x值,或者当不存在符合条件的折线时输出-1。代码使用了多种数学和编程概念,展示了从理论到实际应用的完整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



题意: 一条过点(0, 0) – (x, x) – (2x, 0) – (3x, x) – (4x, 0) – ... - (2kx, 0) – (2kx + x, x) – ....的折线,再给出点(a,b),问经过点(a,b)的折线中,x最小是多少?如果没有折线经过(a, b)则输出-1。答案精确到小数点后9位。

思路:‘/’ 方程式:y=x-2*k*x0   '\'方程式:y=x+x*k*x0     分析可知由于0<x0<=b  所以把x0=b 带入方程得到k,又因为k为整数,将向下k取整后带回原方程就解出x0,ans=两个方程式最小的x0;

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <string.h>
#include <map>
#include <set>
#include <stdlib.h>
using namespace std;
#define maxn 100005
#define inff 0x3FFFFFFF
double Min(double x,double y)
{
    return x<y?x:y;
}

int main()
{
  double a,b;
  double aab,asb,k1,k2;
  while(cin>>a>>b)
  {
      aab=a+b;
      asb=a-b;
      if(asb==0)
      {
          printf("%.12lf\n",b);continue;
      }
      if(asb<0)
      {
          printf("-1\n");
          continue;
      }
      k1=floor(aab/2.0/b);//floor函数向下取整,返回类型为double
      k2=floor(asb/2.0/b);
      printf("%.12lf\n",Min(aab/2.0/k1,asb/2.0/k2));
  }
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值