Openjudge 贪心算法

1038:圣诞老人的礼物-Santa Clau’s Gifts

总时间限制: 1000ms 内存限制: 65536kB

描述

圣诞节来临了,在城市A中圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿最多只能承受一定重量的糖果,请问圣诞老人最多能带走多大价值的糖果。

输入

第一行由两个部分组成,分别为糖果箱数正整数n(1 <= n <= 100),驯鹿能承受的最大重量正整数w(0 < w < 10000),两个数用空格隔开。其余n行每行对应一箱糖果,由两部分组成,分别为一箱糖果的价值正整数v和重量正整数w,中间用空格隔开。

输出

输出圣诞老人能带走的糖果的最大总价值,保留1位小数。输出为一行,以换行符结束。
样例输入

4 15
100 4
412 8
266 7
591 2

样例输出

1193.0

解题思路:
算法:贪心
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
struct candy {
  int val, wei;
  double vw;
};
candy box[105];
bool cmp (candy a, candy b) {
  return a.vw >	b.vw;
}
int main () {
  int n, w, totalw = 0;
  double totalv = 0;
  scanf("%d%d", &n, &w);
  for (int i = 0; i < n; i++) {
  	scanf("%d%d", &box[i].val, &box[i].wei);
  	box[i].vw = box[i].val*1.0/box[i].wei;
  }
  sort(box, box+n, cmp);
  for (int i = 0; i < n; i++) {
  	if (box[i].wei <= w - totalw) {
  	  totalw += box[i].wei;
  	  totalv += box[i].val;
	}
	else {
      totalv += (w-totalw)*box[i].vw;
      break;
	}  
  }
  printf("%.1lf", totalv);
  return 0;
}

1039:电影节

总时间限制: 1000ms 内存限制: 65536kB

描述

大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看(端点可以重合),问李雷最多可以看多少部电影。

输入

多组数据。每组数据开头是n(n<=100),表示共n场电影。
接下来n行,每行两个整数(0到1000之间),表示一场电影的放映区间
n=0则数据结束

输出

对每组数据输出最多能看几部电影
样例输入

8
3 4
0 7 
3 8 
15 19
15 20
10 15
8 18 
6 12 
0

样例输出

3

解题思路:
算法:贪心
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
struct movie { 
  int sta, end;
};
movie mov[1005];
bool cmp (movie a, movie b) {
	return a.end < b.end;
}
int main () {
  int n;
  while (scanf("%d", &n) == 1 && n) {
  	int total = 1;
    for (int i = 0; i < n; i++) scanf("%d%d", &mov[i].sta, &mov[i].end);
	sort(mov, mov+n, cmp);
	int endt = mov[0].end; 
	for (int i = 1; i < n; i++) {
	  if (mov[i].sta >= endt) {
	  	total++;
	  	endt = mov[i].end;
	  }
	}
	printf("%d\n", total);	
  }
  return 0;
}
struct movie { 
  int sta, end;
  bool operator < (const movie &a) const{
  	return this->end < a.end;
  }
};
sort(mov, mov+n);

1040:畜栏保留问题

总时间限制: 1000ms 内存限制: 65536kB

描述

农场有N头牛,每头牛会在一个特定的时间区间[A, B](包括A和B)在畜栏里挤奶,且一个畜栏里同时只能有一头牛在挤奶。现在农场主希望知道最少几个畜栏能满足上述要求,并要求给出每头牛被安排的方案。对于多种可行方案,主要输出一种即可。

输入

输入的第一行包含一个整数N(1 ≤ N ≤ 50, 000),表示有N牛头;接下来N行每行包含两个数,分别表示这头牛的挤奶时间[Ai, Bi](1 ≤ A≤ B ≤ 1, 000, 000)。

输出

输出的第一行包含一个整数,表示最少需要的畜栏数;接下来N行,第i+1行描述了第i头牛所被分配的畜栏编号(从1开始)。
样例输入

5
1 10
2 4
3 6
5 8
4 7

样例输出

4
1
2
3
2
4

解题思路:
算法:贪心
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
struct Cow {
  int a, b;  //挤奶区间起终点
  int No;  //编号
  bool operator<(const Cow &c) const{
  	return a < c.a;
  }
}cows[50100];
int pos[50100];
struct Stall {
  int end;  //结束时间
  int No;  //编号 
  bool operator<(const Stall & s) const{
  	return end > s.end;
  }
  Stall(int e, int n):end(e),No(n){}; 
};
int main () {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
  	scanf("%d%d", &cows[i].a, &cows[i].b);
  	cows[i].No = i;
  }
  sort(cows, cows+n);
  int total = 0;
  priority_queue<Stall> pq;
  for (int i = 0; i < n; i++) {
    if (pq.empty())	{
      ++total;
      pq.push(Stall(cows[i].b, total));
      pos[cows[i].No] = total;
	}
	else {
	  Stall st = pq.top();
	  if (st.end < cows[i].a) {  //端点也不能重合 
	  	pq.pop();
		pos[cows[i].No] = st.No;
		pq.push(Stall(cows[i].b, st.No)); 
	  }
	  else {  //对应if(st.end < cows[i].a) 
	  	 ++total;
	  	 pq.push(Stall(cows[i].b, total));
	  	 pos[cows[i].No] = total;
	  }
	}
  }
  printf("%d\n", total);
  for (int i = 0; i < n; i++)
    printf("%d\n", pos[i]);
  return 0;
}

声明:本文翻译自中国MOOC大学一位讲师的视频。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值