POJ 2128 Highways(水~)

470 篇文章 3 订阅

Description
在一条单向公路上,有n个村庄,第i个村庄只能到i以后的村庄,而不能到i之前的村庄(因为是单行道)。新村长要建两条新路,使得各个村庄之间都能走通(一条反向的就可以,为什么要建两条?题目说了,只建一条不足矣增加自己的政绩),注意,一个村庄最多修建两条铁路
Input
第一行为村庄个数n,第二行为n-1个整数表示n-1个村庄与第一个村庄的距离
Output
第一行输出两条公路的总长,第二行输出两条公路的起点和终点
Sample Input
4
3 5 10
Sample Output
12
3 1 4 2
Solution
找出所有路段中最短的,加上原来的总长,就是答案。有一点要注意,题目说两条路的4个端点必须不同,因此要排除端点重合的问题。另外,n=2和n=3是无解的
Code

#include<stdio.h>
int main()
{
    int n,x[50002],d[50002],i,j,flag,min=100000000;
    scanf("%d",&n);
    scanf("%d",&x[2]);
    for(i=3;i<=n-1;i++)
    {
        scanf("%d",&x[i]);
        d[i-1]=x[i]-x[i-1];//d[i]记录相邻两村庄间距 
        if(min>d[i-1])//更新最小间距和其位置 
        {
            min=d[i-1];
            flag=i-1;
        } 
    }
    scanf("%d",&x[n]);
    if(n<4)//村庄个数小于4则无解 
        printf("0\n");
    else//按格式输出 
        printf("%d\n%d %d %d %d\n",x[n]+min,flag+1,1,n,flag);
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值