水题堆2.N - 无限的路

本文介绍了一个计算二维平面上从原点出发到特定坐标点路径长度的C语言程序。该程序利用数学公式计算从原点出发经过一系列格点到达目标点的最短路径长度,并能够比较两个不同终点之间的路径长度差异。
#include <stdio.h>
#include <math.h>

int main()
{
    int n,i,x1,y1,x2,y2;
    double u,v,s[201],a=0,ans,q1,q2;
    //s[1]=1,a=1;
    s[0]=0;
    for(i=1;i<=200;i++){
        u=i*i+(i-1)*(i-1);
        v=2*i*i;
        a=a+sqrt(u)+sqrt(v);
        s[i]=a;
    }
    scanf("%d",&n);
    while(n--){

            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            q1=s[x1+y1]-y1*sqrt(2);
            q2=s[x2+y2]-y2*sqrt(2);
            ans=q1-q2;
            if(ans<0)ans=-1*ans;
            printf("%.3lf\n",ans);

    }
    return 0;
}

求出原点到(x,0)的距离,每一个要求的点(x1,y1),都可以通过(x1+y1,0)这个点来表示,表示为lx1=lx-y1*根2

求任意两点间的距离则只需求出lx1-lx2

#include<bits/stdc++.h> using namespace std; struct Station { double d, p; bool operator<(const Station& s) const { return d < s.d; } }; int main() { double D1, C, D2, P; int N; cin >> D1 >> C >> D2 >> P >> N; vector<Station> stations(N); for (int i = 0; i < N; ++i) cin >> stations[i].d >> stations[i].p; stations.push_back({0, P}); // 起点作为第一个加油站 stations.push_back({D1, 0}); // 终点,价格为0(无法加油) sort(stations.begin(), stations.end()); // 检查是否所有段都可到达 double max_dist = C * D2; for (int i = 1; i < stations.size(); ++i) { if (stations[i].d - stations[i-1].d > max_dist) { cout << "No Solution" << endl; return 0; } } int n = stations.size(); vector<double> dp(n, 1e20); // dp[i]: 到达第i站时的最小花费 dp[0] = 0; double tank = 0; // 初始油量为0 for (int i = 0; i < n - 1; ++i) { double current_d = stations[i].d; double current_p = stations[i].p; // 遍历所有可能到达的下一个加油站j for (int j = i + 1; j < n && (stations[j].d - current_d) <= max_dist; ++j) { double need_dist = stations[j].d - current_d; double need_oil = need_dist / D2; // 计算需要的油量,若当前油量不够则需加油 if (tank < need_oil) { double add_oil = need_oil - tank; dp[j] = min(dp[j], dp[i] + add_oil * current_p); // 到达j站后,油量为0(刚好用完) tank = 0; } else { // 油量足够,无需加油 dp[j] = min(dp[j], dp[i]); tank -= need_oil; } // 尝试在当前站加满油,看是否能更优到达后续站点 double max_add = C - tank; if (max_add > 0) { double cost_add = max_add * current_p; for (int k = j; k < n && (stations[k].d - current_d) <= max_dist; ++k) { double dist_k = stations[k].d - current_d; double oil_needed_k = dist_k
03-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值