贪心算法之加油问题

  • 【汽车加油问题】一辆汽车加满油后可以行驶n千米。旅途中有k个加油站。若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。
  •  数据输入:由文件input.txt 给出输入数据。第一行有2个正整数n和k,表示汽车加满油后可行驶nkm,且旅途中有k个加油站。接下来1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。
  • 结果输出:将编程计算出的最少加油次数输出到文件ouput.txt。如果无法到达目的地,则输出“No Solution”。
  • 输入文件示例              输出文件示例
  • Input.txt                    output.txt
  • 77                              4
  • 12 3 4 5 1 6 6            
  • 要求:
  • 采用贪心算法,编程计算并输出最少加油次数,以及指出应在那些加油站停靠加油。
  • #include<stdio.h>
    int main()
    {
        FILE *fp;//文件指针
        int a[100],b[100];
        int i,n,k,flag,sum,count,temp;
        fp=fopen("input.txt","r");
        if(fp==NULL)
        {
            printf("无法打开文件!\n");
            exit(0);
        }
        flag=0;
        i=0;
        temp=1;
        while(!feof(fp))
        {
            if(flag==0)
                fscanf(fp,"%d%d",&n,&k);//从文件中读取n,k
            flag=1;
            if(flag!=0)
                {
                    fscanf(fp,"%d",&a[i++]);//从文件中读取加油站之间的距离
                    if(a[i]>n)//如果两站距离大于n,则说明无法到达目的地
                       temp=0;
                }
        }
        fclose(fp);
        if(temp==0)
        {
            fp=fopen("output.txt","w");
            fprintf(fp,"No Solution");
            fclose(fp);
            return 0;
        }
        count=0;
        sum=0;
        for(i=0; i<k+1; i++)
        {
            sum+=a[i];
            if(sum>n)
            {
                i--;
                b[count++]=i+1;
                sum=0;
            }
        }
        fp=fopen("output.txt","w");
        fprintf(fp,"%d",count);//把数据写到文件中去
        fclose(fp);
        return 0;
    }
    
    原文作者:贪心算法
    原文地址: https://blog.csdn.net/qq_31028891/article/details/52956251
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞