Acm学习总结(5)

Acm学习总结(5)
学习心得:将stl的知识运用于贪心算法,vector多被运用因为这是个动态数组所以一般不会越界。
在解题时的个别题很是郁闷以及难以理解,我就把这些题一一收集起来了;
比如这个搬家程序
这层楼沿着走廊南北向的两边各有200个房间。最近,公司要做一次装修,需要在各个办公室之间搬运办公桌。
由于走廊狭窄,办公桌都很大,走廊里一次只能通过一张办公桌。必须制定计划提高搬运效率。
经理制定如下计划:一张办公桌从一个房间移到另一个房间最多用十分钟。当从房间i移动一张办公桌到房间j,两个办公室之间的走廊都会被占用。所以,每10分钟内,只要不是同一段走廊,都可以在房间之间移动办公桌。
移动办公桌 理由
可行的 (房间30到50)和(房间60到90) 走廊不重叠
(房间11到12)和(房间14到13) 走廊不重叠
不可行的 (房间20到40)和(房间31到80) 房间31到房间40的走廊重叠
(房间1到4)和(房间3到6) 房间3前面的走廊重叠
(房间2到8)和(房间7到10) 房间7前面的走廊重叠
这是主要代码;
int i, j;
int move[200];
int N;        //搬运次数
//每次搬运的起点和终点
int from, to;
scanf("%d", &N);
memset(move, 0, sizeof(move));
for(i = 0; i < N; i++)
{
  scanf("%d%d", &from, &to);
  //将房间号映射为走廊号
  from = (from - 1)/2;
  to = (to - 1)/2;
  //确保from<to,C++使用:swap(from, to)
  if(from > to) {
    int temp = from;
    from = to;
    to = temp;
  }
  //占用走廊情况
  for(j = from; j <= to; j++)
    move[j]++;
}
还有钓鱼问题:
题目描述:
约翰有h(1≤h≤16)个小时的时间,在该地区有n(2≤n≤25)个湖,这些湖刚好分布在一条路线上,该路线是单向的。约翰从湖1出发,他可以在任一个湖结束钓鱼。但他只能从一个湖到达另一个与之相邻的湖,而且不必每个湖都停留。
假设湖i(i=1~n—1),以5分钟为单位,从湖i到湖i+1需要的时间用ti(0<ti≤192)表示。例如t3=4,是指从湖3到湖4需要花20分钟时间。
已知在最初5分钟,湖i预计钓到鱼的数量为fi(fi≥0)。以后每隔5分钟,预计钓到鱼的数量将以常数di(di≥0)递减。如果某个时段预计钓到鱼的数量小于或等于di,那么在下一时段将钓不到鱼。为简单起见,假设没有其它的钓鱼者影响约翰的钓鱼数量。
编写程序,帮助约翰制定钓鱼旅行的计划,以便尽可能多的钓到鱼
解题思路; 1)数据结构
每个湖预计钓到鱼的数量,定义为数组:
#define NUM 30
int f[NUM];
每个湖预计钓到鱼的数量的递减值,定义为数组:
int d[NUM];
相邻湖之间的旅行时间,定义为数组:
int t[NUM];
钓鱼计划,定义为数组:
int plan[NUM];
湖的个数n,用于钓鱼的时间h,尽可能多的钓鱼数量best。
主要代码:
//从湖1起到湖pos止,花费时间time(不含路程)的钓鱼计划
void greedy(int pos, int time)
{
  if (time <= 0) return;      //时间已经用完
  int i, j;
  int fish[MAXN];
  int p[MAXN];
  int t = 0;
  for (i = 0; i < pos; ++i)
    fish[i] = f[i];
  memset(p, 0, sizeof§);
  ……
}
//在时间time内,选择鱼最多的湖钓鱼;如果鱼都没有了,就把时间放在湖1上
for (i = 0; i < time; ++i)
{
  int max = 0; //鱼最多的湖中,鱼的数量
  int id = -1;     //鱼最多的湖的编号
  //查找鱼最多的湖中,鱼的数量和湖的编号
  for (j = 0; j < pos; ++j)
    if (fish[j] > max){
      max = fish[j];
      id = j;
    }
  if (id != -1)      //找到了,进行钓鱼处理
  {
    ++p[id];
    fish[id] -= d[id];
    t += max;
  }
  //没有找到(从湖1起到湖pos全部钓完了),就把时间放在湖1上
  else ++p[0];
}
//处理最优方案
if (t > best)
{
  best = t;         //最优值
  memset(plan, 0, sizeof(plan));
  for (i = 0; i < pos; ++i)  //最优解
    plan[i] = p[i];
}
这也就是这次学习总结。

猜你喜欢

转载自blog.csdn.net/ProgreamA/article/details/88696327
今日推荐