鹊桥相会---编程马拉松

来源:互联网 发布:gta5pc捏脸数据女 编辑:程序博客网 时间:2024/04/30 12:04
鹊桥相会
  • 时间限制:1秒空间限制:32768K

题目描述

一年一度的七夕又要到了,可歌可泣的牛郎织女又可以在鹊桥相会了。不知道大家有没有雅兴陪<span>nowcoder</span>坐在葡萄藤下倾听他们的 对话。
我们知道,牛郎要与织女相见,必须要有喜鹊搭桥。所以,牛郎必须在天河岸上等待,直到有喜鹊经过,于是牛郎可以搭乘这只喜鹊 往河对岸走。 当然,牛郎急着去见织女,所有在途中,如果有速度更快的喜鹊赶上了他,他就会换乘那只速度更快的喜鹊。
我们可以假定喜鹊的速度是恒定不变的,并且喜鹊一直是沿直线飞行的(不转弯,更不回头),牛郎坐上喜鹊所花的时间忽略不计。
现给出天河的宽度、每只喜鹊的初始位置(我们设牛郎所在位置为0,天河方向为正方向)以及它们的速度(有可能是负数,代表喜鹊往反 方向飞行),这些数据都是整数。请你来帮忙计算一下牛郎到达对岸与织女相会最少需要多少时间,让他们早些有情人终成眷属。^_^
当然,如果没有喜鹊来搭载牛郎,我们可怜的牛郎就到不了对岸与织女相会了,那我们只好很遗憾的跟牛郎说:“Can't Solve”,我们 祈祷不要发生这样的事情。

输入描述:
第一行有两个数据w、n,分别代表天河的宽度(单位:km)和喜鹊的只数(1≤w≤1000, 1≤n≤10000)。接下来从第二行到第n+1行每行都有两个数据t、v,分别代表1只喜鹊的初始位置(单位:m)和它的飞行速度(单位:m/s)(-1000≤t≤1000, -100≤v≤100)。所有的数据范围都不会超过32位整数的表示范围(用int型数据不会溢出)。


输出描述:
如果牛郎能到达对岸输出他到达对岸所花的总时间(结果精确到秒即可,小数部分舍去);否则输出“Can't Solve”。

输入例子:
1 10 1
输出例子:
1000

PS: 这道题的OJ中是有多组测试数据的,而且是以 0  0  作为结束标志的。。。所以这道题是一个坑。。。希望会改过来吧

AC的代码如下
<span style="font-size:14px;">#include <stdio.h>#include <stdlib.h>#include <iostream>#define MBN 10000//假设最多10000只喜鹊//double BPV[4][2]={{0,1},{-2,4},{-1,5},{0,2}};using namespace std;int solver(int bL, int bN){    int iPB = 0;    double tPB = 0.0;    int bpv[MBN][2];//bpv[MBN][2]:每只喜鹊的初始位置和飞行速度    for (int i = 0; i < bN; i++)    {        cin >> bpv[i][0] >> bpv[i][1];    }    //牛郎到达天河对岸的时间,是所有喜鹊中位置为0或负数的喜鹊最快到达对岸的时间//2015年7月12日23:29:50    for(int i=0; i<bN; i++)    {        if(bpv[i][0]<=0 && bpv[i][1]>0)        {            double t = (double)(bL*1000-bpv[i][0])/bpv[i][1];            if(iPB == 0)//如果第一次发现有位置不在0右边并且速度为正的喜鹊                tPB = t;            if(tPB > t)//发现能更快到达的就选择该喜鹊                tPB = t;            iPB++;        }    }    return tPB;}int main(){    int bL, bN, iPB=0;//bL-天河宽度,bN-喜鹊数目,iPB-位置不在0之后的能到达对岸的喜鹊数目    double tPB=0.0;//tPB-牛郎到达天河对岸的最短时间//    scanf("%d%d",&bL, &bN);    while ( cin >> bL >> bN)    {        if (bL == 0 && bN == 0)        {            break;        }        double tPB = solver(bL, bN);        if(tPB > 0)        {            printf("%.0f\n", tPB);        }        else//if(iPB==0)        {//        printf("数据有误,牛郎不可能到达天河对岸!\n");            printf("Can't Solve\n");        }    }    return 0;}</span>

简要分析:
先给出结论:
                 根据题目要求可以知道,牛郎会乘坐的喜鹊速度一定是正的,而且其起始位置一定是小于等于0的。
首先牛郎不会去乘坐速度为负的喜鹊,这是为什么呢?我们可以利用反正法,假设牛郎会坐速度为负的喜鹊,那么这种情况只有在后面还存在一只喜鹊,速度可以比其他速度为正的喜鹊更快到达终点,可是如果是这样的话,牛郎为什么不等,这只速度飞快的喜鹊赶上来再去乘坐呢,选择去乘坐反方向的喜鹊岂不是多此一举吗?所以我们可以知道,牛郎乘坐的喜鹊必定速度为正。至于零这个情况,喜鹊原地不动,根本不用考虑好吗?

然后是起始位置小于等于0的。也采用反正法就可以证明。假设牛郎会去乘坐一只初始位置为正的喜鹊,那么这种情况的发生只能够是,后者可以更快的到达终点,不过话又说回来,如果其可以更快的到达终点,那么牛郎又怎么可能追上它呢?这不就矛盾了吗? 因此可以知道,此结论也是成立的。

综上可以知道,我们只要去计算速度大于零,起始位置小于等于零的喜鹊到达终点的时间即可,保留其最短一只喜鹊的时间,就是牛郎可以最快到达终点的时间。若没有一只喜鹊能够满足条件,那么牛郎就不能到达终点了,此时就要 Can't Solve 了。

PS: 此题的成像参考了 http://blog.sina.com.cn/s/blog_5f2925ff0100jhug.html这里的相关内容。



0 0
原创粉丝点击