贪心算法实例:安排会场(Java实现)

//读取文件里的活动场次和各个活动的时间

//用贪心算法做出适当的安排,以使用最少的会场安排最多的活动

/*********************greedyselect***************************************/

import java.io.*;
public class GreedySelect
{
  public GreedySelect(String file)throws IOException//输入文件里的场次和时间
  {
  try
  {
   FileReader infile=new FileReader(file);
   BufferedReader inBuffer=new BufferedReader(infile);
   String s=inBuffer.readLine();
   num=Integer.parseInt(s);
   s=inBuffer.readLine();
   int i=0;
   acts=new Activity[num];
  
   while(s!=null)
   {
    acts[i]=new Activity();
    String[] time=new String[3];
    time=s.split("//s");
    acts[i].start=Integer.parseInt(time[0]);
    acts[i].over=Integer.parseInt(time[1]);
    acts[i].index=i;
    s=inBuffer.readLine();
    i++;
   }

  inBuffer.close();
  }
  catch(IOException e)
  {
   e.printStackTrace();
  }

}

public void Sort()//按结束时间非递减排序
  {
  for(int i=0;i<num;i++)
  {
   int k=i;
   for(int j=i+1;j<num;j++)
   if(acts[j].over<acts[k].over) k=j;
   Activity actTemp=new Activity();
   if(i!=k)
   {
    actTemp=acts[i];
    acts[i]=acts[k];
    acts[k]=actTemp;
   }
  }
  }
  public void display()
  {
   for(int i=0;i<num;i++)
   {
    System.out.println(acts[i]);
   }
  }
  public  void greedySelect()//贪心选择,核心代码
  {
   int group=0;
 
  for(int i=0;i<num&&(!acts[i].arrange);i++)
  {
  
  acts[i].arrange=true;
  acts[i].group=group;
  for(int j=1;(j<num)&&(!acts[j].arrange);j++)
  {
   int k=i;
   if(acts[j].start>=acts[k].over)
   {
    
    acts[j].group=group;
    acts[j].arrange=true;
    k=j;
   }
  }
  group++;
  }
  
  
  }
  public void saveFile()throws IOException//保存安排结果到新文件
  {
   try
   {
    FileWriter saveFile=new FileWriter("C://Documents and Settings//Administrator//桌面//活动.txt");
    PrintWriter saveF=new PrintWriter(saveFile);
    for(int i=0;i<num;i++)
    {
     saveF.println(acts[i]);
    }
    saveF.close();
   }
   catch(IOException e)
   {
    e.printStackTrace();
   }
  }
  private Activity[] acts;
  private int num;
 

  private class Activity//定义活动类
  {
   public Activity()
   {
   arrange=false;
   }
   public String toString()
   {
    return ("分组:"+group+"活动编号:"+index+"开始时间:"+start+" 结束时间"+over);
   }
   public int start;
   public int over;
   public int index;
   public int group;
   public boolean arrange;
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值