- (二)贪心算法与哈夫曼树
https://vjudge.net/contest/145673#overview
- A - 简单-部分背包
很经典的暴力题目了
#include<iostream>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
int n, m;
struct p{
int v;
int n;
}item[1005];
bool cmp(p a, p b){
return a.v*b.n > b.v*a.n;
}
int main() {
while (cin >> n >> m,n!=-1){
for (int i = 0; i < m; i++){
scanf("%d%d", &item[i].v, &item[i].n);
}
sort(item, item + m, cmp);
double ans = 0;
for (int i = 0; i < m; i++){
if (n >= item[i].n){
n -= item[i].n;
ans += item[i].v;
}
else{
ans += (double)item[i].v*n / item[i].n;
break;
}
}
cout << fixed << setprecision(3) << ans << endl;
}
return 0;
}
- B - 简单-选择不相交区间
也是很经典的暴力题,要求怎样选择电视节目使得看到的完整电视节目数量最多,只需要尽量选结束时间最早的就行了。
#include<iostream>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
int n;
struct tv{
int beg;
int end;
}item[105];
bool cmp(tv a, tv b){
return a.end < b.end;
}
int main() {
while (cin >> n,n!=0){
for (int i = 0; i < n; i++){
scanf("%d%d", &item[i].beg, &item[i].end);
}
sort(item, item + n, cmp);
int ans = 0;
int cnt = 0;
for (int i = 0; i < n; i++){
if (item[i].beg >= cnt){
cnt = item[i].end;
ans++;
}
}
printf("%d\n", ans);
}
return 0;
}
- C - 简单-区间选点问题
要求求出最少的雷达使得所有小岛都被监视到,只需要求出对于每一个小岛能监视到他的雷达可以放置的最左端坐标和最右端坐标,然后多个小岛的雷达可放置区域重叠则在重叠区放置时得到最小值。
#include<iostream>
#include<string>
#include<algorithm>
#include<math.h>
#include<stdio.h>
using namespace