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大学一位讲师的视频。