洛谷P1081 开车旅行70分

https://www.luogu.org/problem/show?pid=1081

太遗憾了明明写出来了,却把最小值初始值弄小了,从第二个点开始就不可能对了。70分!

复制代码
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,x0,m;
long long  h[1000009];
int f[2][1000009];
double mint1=1e9+9.1,INF=1e9+9.1;
int  mint1w=1;
int now,H=0;
void work(int x,long long  tot,int id,long long  a,long long  b)//当前起点,剩余路程
{
    if(tot==0||x==n)
    {
        if(!b)    return ;
        if(mint1>1.000*a/b)
            mint1=1.000*a/b,mint1w=now,H=h[now];
        if(mint1==1.00*a/b&&h[now]>H)
            mint1w=now,H=h[now];            
        return ;
    }
    int t=f[id][x];
    
    if(abs(h[t]-h[x]) <=tot)
        if(id)    work(t,tot-abs(h[t]-h[x]),!id,a+abs(h[t]-h[x]),b);
        else    work(t,tot-abs(h[t]-h[x]),!id,a,b+abs(h[t]-h[x]));
    else
    {
        if(!b)    return ;
        if(mint1>1.000*a/b)
            mint1=1.000*a/b,mint1w=now,H=h[now];
        if(mint1==1.00*a/b &&h[now]>H)
            mint1w=now,H=h[now];
        return ;
    }        
    return;
} 
void find(int x,long long  tot,int id,long long  a,long long  b)
{
    if(tot==0||x==n)    
    {
        printf("%lld %lld\n",a,b);
        return ;
    }
    int t=f[id][x];
    if(abs(h[t]-h[x])<=tot)
        if(id)    find(t,tot-abs(h[t]-h[x]),!id,a+abs(h[t]-h[x]),b);
        else find(t,tot-abs(h[t]-h[x]),!id,a,b+abs(h[t]-h[x]));
    else
    {
        printf("%lld %lld\n",a,b);
        return ;
    }
}
int main()
{
    
    scanf("%d",&n);
    long long MM=-INF,MW=1;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&h[i]);
        if(h[i]>MM)    MM=h[i],MW=i;
    }
    h[n+1]=1e15+9;
    scanf("%d",&x0);
    double min1,min2,minw1,minw2,t;
    for(int i=1;i<=n;i++)
    {
        min1=INF,min2=INF,minw1=n+1,minw2=n+1,t;
        for(int j=i+1;j<=n;j++)
        {
            t=abs(h[j]-h[i]);
            if(h[j]>h[i])    t+=0.1;
            if(h[j]<h[i]) t-=0.1;
            if(t<min1)
            {
                min2=min1,minw2=minw1;
                min1=t,minw1=j;
            }else            
            if(t<min2)
                min2=t,minw2=j;
        }
        f[0][i]=minw1,f[1][i]=minw2;
    }    
    for(int i=1;i<=n;i++)
        now=i,work(i,x0,1,0,0);
    if(mint1==INF) printf("%d\n",MW);
    else 
        printf("%d\n",mint1w);    
    scanf("%d",&m);
    for(int i=1,S,X;i<=m;i++)
    {
        scanf("%d%d",&S,&X);
        find(S,X*1LL,1,0,0);
    }
    return 0;
}
复制代码

 

posted @   浪矢-CL  阅读(141)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示