环形公路问题

来源:互联网 发布:数据挖掘前景 编辑:程序博客网 时间:2024/05/15 21:17

1. 一个环形公路,不均匀得分布着n个加油站,每个加油站可提供的油量有限,单个加油站的油量之和刚好够一辆汽车跑完一圈,油箱容量不限,油耗均匀。用时间复杂度为O(n)的算法计算出从哪个点出发使得初始油箱为空的汽车刚好可以跑完一圈。思路参考http://blog.sina.com.cn/s/blog_65e729050100m7qy.html

#include<iostream>using namespace std ;#define MAX_NUM 100int main(){    int n ;/*假设加油站从1开始顺序编号, 1,2,…,n*/    double capacity[MAX_NUM+1] ;/*每个加油站的存油量*/    double cost[MAX_NUM+1] ; /*相邻两个加油站间路程消耗油量*/    double remain[MAX_NUM+1] ;/*汽车从第i个加油站出发时,到第i+1个加油站剩余的油量*/    cin>>n ;    for( int i=1 ; i<=n ; i++ )    {        cin>>capacity[i] ;    }    for( int i=1 ; i<=n ; i++ )    {        cin>>cost[i] ;        remain[i] = capacity[i]- cost[i] ;    }    int start = 1 , cnt = 0 , i = 1 ;    double sum = 0.0 ;    while( cnt<n )    {        sum += remain[i] ; /*到达第i+1个站后剩余油量*/        cnt++ ;        if( sum<0 ) /*选第i+1个站作为新起点*/        {            sum = 0.0 ;            start = (i+1>n ? 1:i+1) ;            cnt = 0 ;        }        i = (i+1>n ? 1:i+1) ;    }    cout<<start<<endl ; /*输出找到的第一个满足条件的加油站编号*/    return 0 ;}
测试用例

Sample Input:
5
2.4 3.1 4.0 5.5 4.2
3.0 2.3 1.6 5.9 3.9
Sample Output:
2(或者是3,根据选择的起点不同而异)

2. 一个环形公路,上面有N个站点,A1,A2…, AN,其中Ai和Ai+1之间的距离为Di,AN和A1之间的距离为D0。高效地求第i和第j个站点之间的最短距离,空间复杂度不超过O(N)。(2011Google校园招聘笔试题)

#include<iostream>using namespace std ;#define N 100000int dist[N+1] ;/*dist[i]表示第i个站点到第i+1个站点的最短距离*//*dist[n]存放环形公路的总长度,dist[0] = 0*/int shortest_distance( int i , int j , int n ){    int from , to , d ;    if( i>j )    {        from = j ;        to = i ;    }    else    {        from = i ;        to = j ;    }    d = dist[to-1]-dist[from-1] ;    if( dist[n]-d<d )        return dist[n]-d ;    else        return d ;}int main(){   int n , m , s , t , dst ;   dist[0] = 0 ;   cin>>n ;   for( int i=1 ; i<=n ; i++ )   {       cin>>dst ;       dist[i] = dist[i-1]+dst ;   }   cin>>m ;   while(m--)   {       cin>>s>>t ;       cout<<shortest_distance( s , t , n )<<endl ;   }   return 0 ;}

测试用例

Sample Input:
5 1 2 4 14 9
3
1 3
2 5
4 1
Sample Output:
3
10
7



原创粉丝点击