zoukankan      html  css  js  c++  java
  • 贪心算法之会场安排问题

    【问题描述】

    假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点有不同颜色的最小着色数,相应于要找的最小会场数。)

    【数据输入】

    由文件input.txt给出输入数据,第一行又一个正整数K,表示有K个待安排的活动。

    接下来有K行数据,每行有两个正整数,分别表示K个待安排的活动的开始时间和结束时间。

     

    【结束输出】

    输出最少会场数。

     

    input.txt       output.txt

    5                   3

    1 23

    12 28

    25 35

    27 80

    36 50

    来吧,帮你解决介个问题。。。。。。

    思路:

    按照俺的思路啊~遍历所有的活动时间,设一个int sum代表会场的个数,如果时间可叠加到前面已有活动的会场的,把活动加到已有会场的数组中;如不可叠加,则新加会场重新加一个数组把这个新会场加入到新数组中然后sum+1。

    遍历到最后 sum则就是需要最少的会场的个数·····

    下次再来。。。。。。

    我回来了,上面的思路我尝试了,没试出来。。。。。。

    就换了一种思路,就是做标记,已经加入的会场标记为1 否则为0  就OK了

    代码下次贴上

     

    #include <stdio.h>
    #define LEN 6
    int sum=0;
    int mark[LEN];

    void squarePlan(int s[],int f[])
    {
     int k=1,j;
     int flag=1;
     mark[0]=mark[1]=1;
     while(flag==1)
     {
      mark[k]=1;
      for(int m=k+1;m<=LEN;m++)
      {
       if(mark[m]==0&&s[m]>=f[k])
       {
        mark[m]=1;
        k=m;
       }
      }
      sum++;
      for(j=2;j<LEN;j++)
      {
       if(mark[j]==0){
        k=j;
        break;
       }
      }
     
      flag=0;
      for(int i=1;i<LEN;i++)
      {
       if(mark[i]==0&&i!=j){
        flag=1;
        break;
       }
      }
     }
    }

    int main()
    { int s[LEN],f[LEN];
     int n;
     FILE *fp_in,*fp_out;
     fp_in=fopen("input.txt","r");//打开一个输入流,读取input.txt文件 
        fp_out=fopen("output.txt","w");//打开一个输出流,写output.txt文件 
        if(fp_in==NULL) 
        { 
            printf("open in file failed "); 
            return 0; 
        } 
        if(fp_out==NULL) 
        { 
            printf("open out file failed "); 
            return 0; 
        } 
        fscanf(fp_in,"%d",&n); 
        s[0]=0;
     f[0]=0;
        for(int i=1;i<=n;i++){ 
                fscanf(fp_in,"%d",&s[i]);//x坐标在此题中无用,而y坐标在x坐标之后写入。因此两次写入一样的数组y[LEN] 
                fscanf(fp_in,"%d",&f[i]);
       mark[i]=0;
        } 
             
     squarePlan(s,f);
      printf("%d",sum);
     fprintf(fp_out,"%d ",sum);
     fclose(fp_in);//关闭输入流 
        fclose(fp_out);//关闭输出流 
     return 0;
    }

  • 相关阅读:
    谈谈一些有趣的CSS题目(十四)-- 纯 CSS 方式实现 CSS 动画的暂停与播放!
    Oracle 12c CDB PDB
    sqlplus 调试存储过程
    Oracle 存储过程A
    %notfound的理解——oracle存储过程 .
    ORA-04091: table xxx is mutating, trigger/function may not see it
    JQuery Div scrollTop ScrollHeight
    JQuery JSON Servlet
    div 移动
    HTML 三角符号
  • 原文地址:https://www.cnblogs.com/lyxcode/p/8992482.html
Copyright © 2011-2022 走看看