貪心問題


http://codeup.cn/contest.php?cid=100000584

問題A

題目:看電視(**區間貪心)

題目描述

暑假到了,小明終於可以開心的看電視了。但是小明喜歡的節目太多了,他希望儘量多的看到完整的節目。
現在他把他喜歡的電視節目的轉播時間表給你,你能幫他合理安排嗎?
輸入

輸入包含多組測試數據。每組輸入的第一行是一個整數n(n<=100),表示小明喜歡的節目的總數。
接下來n行,每行輸入兩個整數si和ei(1<=i<=n),表示第i個節目的開始和結束時間,爲了簡化問題,每個時間都用一個正整數表示。
當n=0時,輸入結束。
輸出

對於每組輸入,輸出能完整看到的電視節目的個數。
樣例輸入 Copy

12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0
樣例輸出 Copy

5

分析

每個節目都有開始和結束時間,求最多能看多少節目,問題簡化爲:區間貪心 問題
在這裏插入圖片描述

數據結構

typedef struct TV
{
    int si,ei;//開始,結束
}TV;
int n;
int sum,lasttime;

選擇左端點最大的區間

//按左端點降序排列(從大到小),若相同按右端點升序排列
bool cmp(TV a,TV b)
{
    if(a.si!=b.si)return a.si>b.si;
    return a.ei<b.ei;
}
//Program[0].ei是時間軸上的最大時間點,選擇左端點最大就是在時間軸上從大往小選
sum=0;
lasttime=Program[0].ei;
for(int i=0;i<n;i++){
            if(Program[i].ei<=lasttime){//在尾端之前的最大的被添加
                sum++;
                lasttime=Program[i].si;
            }
        }
        printf("%d\n",sum);

選擇右端點最小的區間

//按右端點升序排列(從小到大),若相同按左端點降序排列
bool cmp(TV a,TV b)
{
    if(a.ei!=b.ei)return a.ei<b.ei;
    return a.si>b.si;
}
//0是時間軸上的最小時間點,選擇右端點最小就是在時間軸上從小往大選
int sum=0,lasttime=0;
        for(int i=0;i<n;i++){
            if(Program[i].si>=lasttime){//在尾端之後的最小的被添加
                sum++;
                lasttime=Program[i].ei;
            }
        }
        printf("%d\n",sum);

AC代碼

左端點最大

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef struct TV
{
    int si,ei;//開始,結束
}TV;
int n;
//按左端點降序排列(從大到小),若相同按右端點升序排列
bool cmp(TV a,TV b)
{
    if(a.si!=b.si)return a.si>b.si;
    return a.ei<b.ei;
}
int main()
{
    while(scanf("%d",&n)!=EOF){
        if(n==0)break;
        TV Program[n];
        for(int i=0;i<n;i++)
            scanf("%d %d",&Program[i].si,&Program[i].ei);
        sort(Program,Program+n,cmp);
        int sum=0,lasttime=Program[0].ei;
        for(int i=0;i<n;i++){
            if(Program[i].ei<=lasttime){//在尾端之前的最大的被添加
                sum++;
                lasttime=Program[i].si;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

右端點最小

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef struct TV
{
    int si,ei;
}TV;
int n;
bool cmp(TV a,TV b)
{
    if(a.ei!=b.ei)return a.ei<b.ei;
    return a.si>b.si;
}
int main()
{
    while(scanf("%d",&n)!=EOF){
        if(n==0)break;
        TV Program[n];
        for(int i=0;i<n;i++)
            scanf("%d %d",&Program[i].si,&Program[i].ei);
        sort(Program,Program+n,cmp);
        int sum=0,lasttime=0;
        for(int i=0;i<n;i++){
            if(Program[i].si>=lasttime){//在尾端之後的最小的被添加
                sum++;
                lasttime=Program[i].ei;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

問題B

題目:出租車費(***簡單貪心)

題目描述

某市出租車計價規則如下:起步4公里10元,即使你的行程沒超過4公里;接下來的4公里,每公里2元;之後每公里2.4元。行程的最後一段即使不到1公里,也當作1公里計費。
一個乘客可以根據行程公里數合理安排坐車方式來使自己的打車費最小。
例如,整個行程爲16公里,乘客應該將行程分成長度相同的兩部分,每部分花費18元,總共花費36元。如果坐出租車一次走完全程要花費37.2元。
現在給你整個行程的公里數,請你計算坐出租車的最小花費。

輸入

輸入包含多組測試數據。每組輸入一個正整數n(n<10000000),表示整個行程的公里數。
當n=0時,輸入結束。
輸出

對於每組輸入,輸出最小花費。如果需要的話,保留一位小數。
樣例輸入 Copy

3
9
16
0
樣例輸出 Copy

10
20.4
36

分析

在不分段的情況下:
0~4:10
5~8:8
9~12:9.6
同是4公里,5 ~ 8 或者 9 ~ 12 都比 0 ~ 4要小;
∴在<=8之前不分段就好
在>8之後,要分情況討論:

9 ~ 13=12就和 0 ~ 4 + 5=12持平了;
接着(9 ~ 14=)14.5 > (0 ~ 4+5 ~ 6=)14
∴若是<=12那麼不分段費用最小;否則分段更小

較長的路程如何分段最小呢?
先按照8公里分段,剩下不足8公里的:
若<=4則不分段(相當於<=12的情況)
若>4則把剩下這一部分分段處理0~4+(n-4)

注意

如果需要的話,保留一位小數。
如何判斷有無小數

const double eps=1e-6;
int tmp=(int)sum;
		if(sum-tmp<eps) printf("%d\n",tmp);
		else printf("%.1lf\n",sum);

AC代碼

#include <iostream>
#include <cstdio>
using namespace std; 
const int nmax=10000000+10;
const double eps=1e-6;
 
int main(int argc, char** argv) {
	int n;
	while(1){
		cin>>n;
		if(n==0){
			break;
		}
		double sum=0;
		if(n<=4){
			sum=10;
		}
		else if(n<=8){
			sum=10+(n-4)*2;
		}
		else{
			while(n>=8){
				sum+=18;
				n-=8;
			}
			if(n<=4){
				sum+=2.4*n;
			}
			else{
				sum+=10+(n-4)*2;
			}
		}
		int tmp=(int)sum;
		if(sum-tmp<eps) printf("%d\n",tmp);
		else printf("%.1lf\n",sum);
	}
	return 0;
}

問題C

題目To Fill or Not to Fill(*****簡單貪心)

題目描述

With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to find gas stations on the way from time to time. Different gas station may give different price. You are asked to carefully design the cheapest route to go.

輸入

Each input file contains one test case. For each case, the first line contains 4 positive numbers: Cmax (<= 100), the maximum capacity of the tank; D (<=30000), the distance between Hangzhou and the destination city; Davg (<=20), the average distance per unit gas that the car can run; and N (<= 500), the total number of gas stations. Then N lines follow, each contains a pair of non-negative numbers: Pi, the unit gas price, and Di (<=D), the distance between this station and Hangzhou, for i=1,…N. All the numbers in a line are separated by a space.

輸出

For each test case, print the cheapest price in a line, accurate up to 2 decimal places. It is assumed that the tank is empty at the beginning. If it is impossible to reach the destination, print “The maximum travel distance = X” where X is the maximum possible distance the car can run, accurate up to 2 decimal places.

樣例輸入 Copy

59 525 19 2
3.00 314
3.00 0
樣例輸出 Copy

82.89
提示

該題目所要解決的問題是:給定若干加油站信息,問能否駕駛汽車行駛一定的距離。如果能夠行駛完全程,則計算最小花費。若不能行駛完全程,則最遠能夠行駛多長距離。

拿到這一題,首先判斷汽車是否能夠行駛到終點。什麼情況下汽車無法行駛到終點呢?兩種情況:起點根本就沒有加油站,汽車無法啓動;或者中途兩個加油站之間的距離大於加滿油後汽車能夠行駛的最大距離。前者汽車行駛的最大距離爲0.00,而後者最大距離爲當前加油站的距離加上在這個加油站加滿油後能夠行駛的最大距離。在這裏,需要將加油站按到杭州的距離從小到大排序。

接下來在能夠行駛到終點的情況下計算最小花費。我們首先從路程來考慮,如果在路上,我們能夠使用最便宜的汽油,當然就在那個加油站加油了。所以從起點開始遍歷每個加油站。假設遍歷到了第i個加油站,我們現在來判斷在加油站i應該加多少油。設當前汽車離杭州的距離爲curLen,當前加油站離杭州的距離爲nodes[i].dis,加滿油以後汽車能夠行駛的最大距離爲(dis=cmax*len)。這樣就有node[i].dis <= curLen <= nodes[i].dis+dis,否則的話第i個加油站的油是不起作用的。於是在第i個加油站的作用範圍內尋找有沒有更爲便宜的加油站,如果有,則下次使用這個加油站的油(j),這次汽車應該行駛到這個加油站,即touch=nodes[j].dis。如果沒有找到更爲便宜的加油站則可以在第i個加油站加滿油,即touch=nodes[i].dis+dis。然後判斷下次應該行駛到的距離與當前距離的關係,如果下次應當行駛到的距離大於當前距離,則汽車行駛,否則不動(也就是說上個加油站的油更便宜,後一個加油站也便宜,根本就不需要在當前加油站加油)。

分析

1.是否能夠行駛到終點

拿到這一題,首先判斷汽車是否能夠行駛到終點。
什麼情況下汽車無法行駛到終點呢?兩種情況:

  1. 起點根本就沒有加油站,汽車無法啓動:汽車行駛的最大距離爲0.00
  2. 中途兩個加油站之間的距離大於加滿油後汽車能夠行駛的最大距離:最大距離爲當前加油站的距離加上在這個加油站加滿油後能夠行駛的最大距離。
    主函數中
sort(gas,gas+N,cmp);

           /* printf("\n");
            for(int i=0;i<N;i++)
                printf("%.0lf %.2lf\n",gas[i].D,gas[i].P);
            printf("\n");*/

        if(gas[0].D!=0)//如果沒有初始站在杭州的,必失敗(車子一開始無油)
        //無法行駛到終點情況1
            printf("The maximum travel distance = %.2lf\n",0);
        else{
            bool flag=true;//能否到達終點的標誌
            int i;
            for(i=1;i<N;i++){//i代表下一站
                if(Dmax-(D-gas[i-1].D)>=eps)//若滿油可直接從這一加油站到達終點
                    break;
                if((gas[i].D-gas[i-1].D)-Dmax>eps)//若滿油都無法從這一加油站到達下一加油站
                    {
                        flag=false;
                        break;
                    }
            }
            if(i==N&&(D-gas[i-1].D)-Dmax>eps)//最後一個加油站滿油不能到達終點要另外考慮
                flag=false;
            
            if(!flag)
            //無法行駛到終點情況2
                printf("The maximum travel distance = %.2lf\n",Maxlength(gas));
            else{
            //可以行駛到終點
                double sum=0;
                cheap(gas,sum);
                printf("%.2lf\n",sum);
            }
        }

無法行駛到終點情況2的函數

double Maxlength(Gstation gas[])
{
    double sum=0;
    for(int i=1;i<N;i++){
                if((gas[i].D-gas[i-1].D)-Dmax>eps)//若滿油不可以從這一加油站到達下一加油站
                  return sum+Dmax;
                sum=gas[i].D;
    }
    //若滿油不可以從最後一個加油站到達終點
    return sum+Dmax;
}

在這裏,需要將加油站按到杭州的距離從小到大排序。

注意

  1. 起點沒有加油站不需計算最大里程,直接輸出0
  2. 滿油可以在每個加油站之間穿行考慮過之後,還需要考慮能不能從最後一個加油站到達終點【主函數和子函數中都需考慮】
  3. 若能從這個加油站gas[i-1]到達下一個加油站gas[i],那麼暫時最大里程數sum就是下一個加油站距離杭州的距離gas[i].D,若不能則爲sum+Dmax並退出

2.計算最小花費

接下來在能夠行駛到終點的情況下計算最小花費。

我們首先從路程來考慮,如果在路上,我們能夠使用最便宜的汽油,當然就在那個加油站加油了。
所以從起點開始遍歷每個加油站。 for(int i=0;i<N;)

需要在之前設置的量:
								double C=0,Cept=Cmax;//當前油量C=0,當前可裝油Cept=Cmax
    							int next,j;//next下一站

從起點開始遍歷每個加油站,假設遍歷到了第i個加油站,我們現在來判斷在加油站i應該加多少油。
設當前汽車離杭州的距離爲Len,當前加油站離杭州的距離爲gas[i].D,加滿油以後汽車能夠行駛的最大距離爲Dmax。
這樣就有gas[i].D <=Len <= gas[i].D+Dmax,否則的話第i個加油站的油是不起作用的。
		假設下一站next不變,next=i
		於是在第i個加油站的作用範圍內尋找有沒有更爲便宜的加油站。for(j=i+1;(gas[i].D+Dmax-gas[j].D)>=-eps&&j<N;j++)
				如果有,則下次使用這個(j)加油站的油(next=j),
							若手頭油足夠達到這個加油站則不加油
							若手頭油不足,			則加油:    這次汽車應該加油到剛好    行駛到這個加油站
							break;
		如果沒有(next==i)找到更爲便宜的加油站
				如果當前滿油不足以到達終點
							則可以在第i個加油站加滿油
							到達下一個加油站再觀察next++(然後再到達比這個最便宜加油站略貴的【即在下個加油站範圍內最便宜的加油站】加油)
				否則
							加部分油,剛好足夠到達終點即可
							返回油費
		下一個i遍歷下一站next:i=next
void cheap(Gstation gas[],double &sum)//油費sum
{
    double C=0,Cept=Cmax;//當前油量C=0,當前可裝油Cept=Cmax
    int next,j;//next下一站
    for(int i=0;i<N;){
    //從起點開始遍歷每個加油站i

        next=i;
        //第i個加油站的範圍是gas[i].D~gas[i].D+Dmax
        //gas[j].D<=(gas[i].D+Dmax),因爲是浮點數,且包括了等於,所以要相減和-0.000005比
        for(j=i+1;(gas[i].D+Dmax-gas[j].D)>=-eps&&j<N;j++){
        //在第i個加油站的作用範圍內[nodes[i].dis,nodes[i].dis+dis]尋找有沒有更爲便宜的加油站

            if((gas[i].P-gas[j].P)>=eps){
            //如果有,則下次使用這個加油站的油(j),


                if((C*Davg-(gas[j].D-gas[i].D))>eps){
                //若手頭油足夠達到這個加油站則不加油

                            //printf("不加油         %.0lf~%.0lf:    到%.0lf站%.2lf                    當前油量%.2lf\n",gas[i].D,gas[j].D,gas[j].D,gas[j].D-gas[i].D,C);
                    Cept+=(gas[j].D-gas[i].D)/Davg;C-=(gas[j].D-gas[i].D)/Davg;
                }
                else{
                //若手頭油不足,則加油
                //這次汽車應該加油到剛好    行駛到這個加油站

                            //printf("+油錢%.2lf    %.0lf~%.0lf:    到%.0lf站%.2lf《-》需加油%.2lf     當前油量%.2lf\n",(gas[j].D-gas[i].D-C*Davg)/Davg*gas[i].P,gas[i].D,gas[j].D,gas[j].D,gas[j].D-gas[i].D,(gas[j].D-gas[i].D-C*Davg)/Davg,C);
                    sum+=(gas[j].D-gas[i].D-C*Davg)/Davg*gas[i].P;
                    Cept=Cmax;C=0;//到達下一站的情況
                }
                next=j;
                break;
            }
        }
        if(next==i){
        //如果沒有找到更爲便宜的加油站

            if((D-gas[i].D-Dmax)>eps){
            //如果當前滿油不足以到達終點
            //則可以在第i個加油站加滿油
                           // printf("+油錢%.2lf    %.0lf~滿油:     到下一站即可《-》需加油%.2lf      當前油量%.2lf\n",(Cept)*gas[i].P,gas[i].D,Cept,C);
                sum+=Cept*gas[i].P;
                Cept=(gas[i+1].D-gas[i].D)/Davg;C=Cmax-Cept;//到達下一站的情況

                next++;
            }
            else{
                            // printf("+油錢%.2lf   %.0lf~部分油:   能到終點《-》需加油%.2lf          當前油量%.2lf\n",(D-gas[i].D-C*Davg)/Davg*gas[i].P,gas[i].D,(D-gas[i].D-C*Davg)/Davg,C);
                sum+=(D-gas[i].D-C*Davg)/Davg*gas[i].P;
                return;
            }
        }
        i=next;
    }
}

注意

  1. 浮點數的比較要相減和0.0000005作比較
 const double eps=0.000005;
 double a,b;
 (1)a>b
 	a-b>eps
 (2)a>=b,要包括0,那麼就大於-0.00000005
 	a-b>-eps
  1. 里程和油量要分清楚
    里程/Davg=油量

AC代碼

#include <bits/stdc++.h>
using namespace std;
const double eps=0.000005;
double Cmax,D,Davg,Dmax;//油箱容量Cmax,距離D,每單元油能跑的平均里程數Davg,在加油站加滿油的最大里程數Dmax
int N;//加油站數量N
typedef struct Gstation{
     double P;
     double D;
}Gstation;
bool cmp(Gstation a,Gstation b){//按距離升序排序
    return a.D<b.D;
}
void cheap(Gstation gas[],double &sum)//油費sum
{
    double C=0,Cept=Cmax;//當前油量C=0,當前可裝油Cept=Cmax
    int next,j;//next下一站
    for(int i=0;i<N;){
    //從起點開始遍歷每個加油站i

        next=i;
        //第i個加油站的範圍是gas[i].D~gas[i].D+Dmax
        //gas[j].D<=(gas[i].D+Dmax),因爲是浮點數,且包括了等於,所以要相減和-0.000005比
        for(j=i+1;(gas[i].D+Dmax-gas[j].D)>=-eps&&j<N;j++){
        //在第i個加油站的作用範圍內[nodes[i].dis,nodes[i].dis+dis]尋找有沒有更爲便宜的加油站

            if((gas[i].P-gas[j].P)>=eps){
            //如果有,則下次使用這個加油站的油(j),


                if((C*Davg-(gas[j].D-gas[i].D))>eps){
                //若手頭油足夠達到這個加油站則不加油

                            //printf("不加油         %.0lf~%.0lf:    到%.0lf站%.2lf                    當前油量%.2lf\n",gas[i].D,gas[j].D,gas[j].D,gas[j].D-gas[i].D,C);
                    Cept+=(gas[j].D-gas[i].D)/Davg;C-=(gas[j].D-gas[i].D)/Davg;
                }
                else{
                //若手頭油不足,則加油
                //這次汽車應該加油到剛好    行駛到這個加油站

                            //printf("+油錢%.2lf    %.0lf~%.0lf:    到%.0lf站%.2lf《-》需加油%.2lf     當前油量%.2lf\n",(gas[j].D-gas[i].D-C*Davg)/Davg*gas[i].P,gas[i].D,gas[j].D,gas[j].D,gas[j].D-gas[i].D,(gas[j].D-gas[i].D-C*Davg)/Davg,C);
                    sum+=(gas[j].D-gas[i].D-C*Davg)/Davg*gas[i].P;
                    Cept=Cmax;C=0;//到達下一站的情況
                }
                next=j;
                break;
            }
        }
        if(next==i){
        //如果沒有找到更爲便宜的加油站

            if((D-gas[i].D-Dmax)>eps){
            //如果當前滿油不足以到達終點
            //則可以在第i個加油站加滿油
                           // printf("+油錢%.2lf    %.0lf~滿油:     到下一站即可《-》需加油%.2lf      當前油量%.2lf\n",(Cept)*gas[i].P,gas[i].D,Cept,C);
                sum+=Cept*gas[i].P;
                Cept=(gas[i+1].D-gas[i].D)/Davg;C=Cmax-Cept;//到達下一站的情況

                next++;
            }
            else{
                            // printf("+油錢%.2lf   %.0lf~部分油:   能到終點《-》需加油%.2lf          當前油量%.2lf\n",(D-gas[i].D-C*Davg)/Davg*gas[i].P,gas[i].D,(D-gas[i].D-C*Davg)/Davg,C);
                sum+=(D-gas[i].D-C*Davg)/Davg*gas[i].P;
                return;
            }
        }
        i=next;
    }
}
//最大里程數
double Maxlength(Gstation gas[])
{
    double sum=0;
    for(int i=1;i<N;i++){
                if((gas[i].D-gas[i-1].D)-Dmax>eps)//若滿油不可以從這一加油站到達下一加油站
                  return sum+Dmax;
                sum=gas[i].D;
    }
    //若滿油不可以從最後一個加油站到達終點
    return sum+Dmax;
}
int main()
{
    while(scanf("%lf %lf %lf %d",&Cmax,&D,&Davg,&N)!=EOF){
        Dmax=Cmax*Davg;//在加油站加滿油的最大里程數

        Gstation gas[N];

        for(int i=0;i<N;i++)
            scanf("%lf %lf",&gas[i].P,&gas[i].D);
        sort(gas,gas+N,cmp);

           /* printf("\n");
            for(int i=0;i<N;i++)
                printf("%.0lf %.2lf\n",gas[i].D,gas[i].P);
            printf("\n");*/

        if(gas[0].D!=0)//如果沒有初始站在杭州的,必失敗(車子一開始無油)
        //無法行駛到終點情況1
            printf("The maximum travel distance = %.2lf\n",0);
        else{
            bool flag=true;//能否到達終點的標誌
            int i;
            for(i=1;i<N;i++){//i代表下一站
                if(Dmax-(D-gas[i-1].D)>=eps)//若滿油可直接從這一加油站到達終點
                    break;
                if((gas[i].D-gas[i-1].D)-Dmax>eps)//若滿油都無法從這一加油站到達下一加油站
                    {
                        flag=false;
                        break;
                    }
            }
            if(i==N&&(D-gas[i-1].D)-Dmax>eps)//最後一個加油站滿油不能到達終點要另外考慮
                flag=false;
            
            if(!flag)
            //無法行駛到終點情況2
                printf("The maximum travel distance = %.2lf\n",Maxlength(gas));
            else{
            //可以行駛到終點
                double sum=0;
                cheap(gas,sum);
                printf("%.2lf\n",sum);
            }
        }
    }
    return 0;
}

參照代碼

#include<bits/stdc++.h>
#define eps 1e-7
using namespace std;
struct Station{
	double p;
	int l;
};
int cmp(Station a, Station b){
	return a.l < b.l;
}
int main()
{
	double maxOil, Destination, Distance_perOil ;
	Station sta[501];
	int num_gasStation;
	while(scanf("%lf %lf %lf %d", &maxOil, &Destination, &Distance_perOil, &num_gasStation)!=EOF){
		//數據整理
		for(int i=0; i<num_gasStation; i++){
			scanf("%lf %d", &sta[i].p, &sta[i].l);
		}
		sort(sta, sta+num_gasStation, cmp);
		sta[num_gasStation].l=Destination;
		sta[num_gasStation].p=0;
		//計算最小代價
		double sum = 0, cur_remainOil=0;
		int now=0, unreachable=0;
		double Distance_fullOil = maxOil * Distance_perOil;
		while(now < num_gasStation){  //判斷是否到達終點
			double expect_remainOil;
			if( fabs(sta[0].l) > eps){
				printf("The maximum travel distance = 0.00\n");
				unreachable = 1;
				break;
			}
			//相鄰油站 是否 跨度太長
			if( (sta[now+1].l - sta[now].l) > Distance_fullOil ){
				printf("The maximum travel distance = %.2f\n", sta[now].l+Distance_fullOil);
				unreachable = 1;
				break;
			}
			//尋找 油價最便宜的油站
			int min = now;
			for(int i=now+1; ((sta[i].l - sta[now].l) <= Distance_fullOil) && (i <= num_gasStation); i++){
				if (sta[i].p < sta[now].p ){
					min = i;
					break;
				}
			}
			expect_remainOil = (sta[min].l - sta[now].l)/Distance_perOil; 
			// 找不到,那麼加滿油
			if( min == now ){expect_remainOil = maxOil;}
			//判斷加多少油
			double add_Oil = 0;
			if (cur_remainOil < expect_remainOil) {add_Oil = expect_remainOil - cur_remainOil;}
			//計算油錢
			
			//	printf("油量:%.2lf 加油錢:%.2lf 站內範圍最便宜%d\n",expect_remainOil,add_Oil * sta[now].p,min);
			
			sum += add_Oil * sta[now].p;
			//printf("expect_remainOil = %.2f, cur_remainOil = %.2f, add_Oil= %.2f, sum = %.2f", expect_remainOil, cur_remainOil, add_Oil, sum);
			//更新當前剩餘油量
			cur_remainOil = cur_remainOil + add_Oil - (sta[now+1].l - sta[now].l) / Distance_perOil;
			// printf("%.2f\n", cur_remainOil);
			now ++;
		}
		//輸出總油費
		if(unreachable == 0) printf("%.2f\n", sum);
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章