第4章-贪心算法-习题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3
算法实现题4-5 程序存储问题
问题描述: 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。
程序i存放在磁带上的长度是 li,1 ≤ i ≤ n。 程序存储问题要求确定这n 个程序在磁带上的一个
存储方案,使得能够在磁带上存储尽可能多的程序。 编程任务:
对于给定的n个程序存放在磁带上的长度,编程计 算磁带上最多可以存储的程序数。
对于给定的正整数a,编程计算删去k个数字后得到的 最小数。
22
算法实现题4-12 删数问题
数据输入: 文件的第1 行是1 个正整数a。第2 行是正整数k。
结果输出: 计算出的最小数。
输入示例 178543 4 输出文件示例
13
23
算法实现题4-12 删数问题
void delek(string a, int k) { //在整数a中删除k个数字
对于给定的n个顾客需要的服务时间和s的值,编程 计算最优服务次序。
12
算法实现题4-7 多处最优服务次序问题
数据输入: 第一行有2 个正整数n 和s,表示有n 个顾客且有s
处可以提供顾客需要的服务。接下来的1 行中,有n 个正整数,表示n个顾客需要的服务时间。 结果输出:
最小平均等待时间。 输入示例 10 2 56 12 1 99 1000 234 33 55 99 812 输出示例 336
算法实现题4-5 程序存储问题
int greedy( vector<int> x, int m){
int i=0, sum=0, n=x.size();
sort(x.begin(),x.end());
while(i < n){
sum += x[i];
if(sum <= m) i++;
else return i;
int m = a.size();
if(k >= m){ a.erase();return;} //全部删除
while(k > 0)
{
//寻找最近下降点
int i;
for(i=0;(i< a.size() -1) && (a[i] <= a[i+1]); ++i);
a.erase(i,1),k--; //每次删除1个,最近下降点优先
排序后的数据
t /= n;
return t; }
14
算法实现题4-9 汽车加油问题
问题描述 一辆汽车加满油后可行驶nkm 。旅途中有若干个加
油站。设计一个有效算法,指出应在哪些加油站停靠 加油,使沿途加油次数最少。 编程任务
对于给定的n和k个加油站位置,编程计算最少加油 次数。
15
算法实现题4-9 汽车加油问题
26
算法实现题4-15 套汇问题
while(1){
cin >> n;
if(n == 0) break;
//输入结束
for(i=0; i < n; ++i) cin >> name[i];
532.00
10
算法实现题4-6 最优服务次序问题
double greedy( vector<int> x) {
int i,n=x.size(); sort(x.begin(),x.end()); for(i=1;i<n;++i)
x[i] += x[i-1]; double t=0; for(i=0;i<n;++i) t+=x[i]; t /= n;
2. 通过货币兑换,一个商人可以从1 美元开始买入,得到 0.7×9.5×0.16=1.064美元,从而获得6.4%的利润。
编程任务: 给定n 种货币c1,c2,c3,...,cn的有关兑换率,试设计
一个有效算法,用以确定是否存在套汇的可能性。
25
算法实现题4-15 套汇问题
数据输入:
本题有多个测试数据项。每个测 试数据项的第一行中只有1 个整数 n (1≤n ≤30),表示货币总数。其后 n行给出n种货币的名称。接下来 的一行中有1 个整数m,表示有m 种不同的货币兑换率。其后m行给 出m种不同的货币兑换率,每行有 3 个数据项ci , rij 和cj ,表示货 币ci 和cj的兑换率为 rij。文件最后 以数字0 结束。
加 1 13 46 101 157 256 355 589 1401 240111
算法实现题4-7 多处最优服务次序问题
问题描述: 设有n 个顾客同时等待一项服务。顾客i需要的服务
时间为ti ,1<= i <= n。共有s 处可以提供此项服务。 应如何安排n 个顾客的服务次序才能使平均等待时间 达到最小?平均等待时间是n个顾客等待服务时间的总 和除以n。 编程任务:
第4章 贪心算法
1
课程安排
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 周二 P P T T P T T P T T P T T T T P
周四 P
P
P
P
P
P
P
P
P
P
P
P
P
P
端午
考试 T
2
第4章 贪心算法
1. 会场安排问题 2. 最优合并问题 3. 磁带最优存储问题 4. 磁盘文件最优存储问题 5. 程序存储问题 6. 最优服务次序问题 7. 多处最优服务次序问题 8. d森林问题 9. 汽车加油问题 10. 区间覆盖问题 11. 硬币找钱问题 12. 删数问题 13. 数列极差问题
6
算法实现题4-5 程序存储问题
数据输入:
第一行是2 个正整数,分别表示文件个数n和磁带的长 度L。接下来的1 行中,有n个正整数,表示程序存放在磁 带上的长度。
结果输出: 最多可以存储的程序数。
输入示例
6 50
2 3 13 8 80 20 输出示例
5
i 012345
x 2 3 13 8 80 20 7
int greedy(vector<int> x,int k)
{
int i,sum = 1,n=x.size();
sort(x.begin(),x.end());
int temp = x[0];
//区间的起始位置
for(i=1;i < n; ++i)
if(x[i] - temp > k) {sum++,temp=x[i]};
算法实现题4-9 汽车加油问题
读取数据: int t,n,k; scanf("%d%d",&n,&k); vector<int> x; for(int i=0;i<=k;i++){
scanf("%d",&t); x.push_back(t); } 调用和输出: int temp = greedy(x,n); if (temp>=0) printf("%d\n",temp);
i=3 10 i=4 9 i=6 12 i=7 12
for(i=0,s=0;i <k; ++i) {
s += x[i];
if(s > n) sum++,s = x[i];
} return sum; }
k01234567 x12345166
加油站数
起点 012 3 4
56
终点
7
8
12 3 4
5
1
6
6
17x
数据输入:
第一行有2 个正整数n和k,表示有n个点,且固定 长度闭区间的长度为k。接下来的1 行中,有n个整数, 表示n个点在实直线上的坐标(可能相同)。
结果输出:
最少区间数。
输入示例
73
1 2 3 4 5 -2 6 输出文件示例
30
123456
-2 -1 0 1 2 3 4 5 6 20
算法实现题4-10 区间覆盖问题
结果输出:
对每个测试数据项j,如果存在套 汇的可能性则输出“Case j yes”, 否则输出“Case j no”。
输入示例 3 USDollar BritishPound FrenchFranc 3 USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar 0 输出示例 Case 1 yes
13
算法实现题4-7 多处最优服务次序问题
double greed(vector<int> x,int s) {
vector<int> st(s+1,0); vector<int> su(s+1,0); int n = x.size();
st
服务数组
01
1 12
sort(x.begin(),x.end());
}
return n; }
//所有的程序都没有磁带长
i 012345
x 2 3 8 13 20 80
贪心策略:最短程序优先
排序后的数据
8
算法实现题4-6 最优服务次序问题
问题描述: 设有n 个顾客同时等待一项服务。顾客i需要的服务
时间为ti, 1<=i <= n 。应如何安排n个顾客的服务次序 才能使平均等待时间达到最小?平均等待时间是n 个 顾客等待服务时间的总和除以n。 编程任务:
}
while(a.size() > 1 && a[0] == '0') a.erase(0,1);
}
//删除前导0
能使用
m吗?
24
算法实现题4-15 套汇问题
问题描述: 套汇是指利用货币汇兑率的差异将一个单位的某种
货币转换为大于一个单位的同种货币。
1. 例如,假定1 美元可以买0.7 英镑,1 英镑可以买9.5 法郎, 且1 法郎可以买到0.16美元。
18
算法实现题4-10 区间覆盖问题
问题描述: 设x1 , x2 ,... , xn 是实直线上的n个点。用固定长度
的闭区间覆盖这n个点,至少需要多少个这样的固定 长度闭区间?设计解此问题的有效算法。 编程任务:
对于给定的实直线上的n个点和闭区间的长度k,编 程计算覆盖点集的最少区间数。
19
算法实现题4-10 区间覆盖问题
对于给定的n个顾客需要的服务时间,编程计算最 优服务次序。
9
算法实现题4-6 最优服务次序问题
数据输入: 第一行是正整数n,表示有n 个顾客。接下来的1行
中,有n个正整数,表示n个顾客需要的服务时间。 结果输出:
计算出的最小平均等待时间。 输入示例 10
56 12 1 99 1000 234 33 55 99 812 输出示例
定义:
vector<int> x; 读取数据:
int n; scanf(“%d”, &n); int temp; for (int i=0; i<n; i++){
scanf(“%d”, &temp); x.push_back(temp); }
return t;
}
i 01234567 8 9
x 1 12 33 55 56 99 99 234 812 1000
数据输入
第1行有2个正整数n和k,表示汽车加满油后可行驶nkm, 且旅途有k个加油站。接下来的一行中,有k+1个整数,表示 第k个加油站与第k-1个加油站之间的距离。第0个加油站表 示出发地,汽车已加满油。第k+1个加油站表示目的地。
结果输出
计算出的最少加油次数。如果无法到达目的地,则输 出”No Solution”。
输入示例 77
输出示例 4
1 2 3 4 5 1 6 6 加油站数
起点 012 3 4
56
终点
7
8
12 3 4
5
1
6
6
16x
算法实现题4-9 汽车加油问题
int greedy(vector<int> x,int n)
{
பைடு நூலகம்
int j,i,s,sum=0, k=x.size();
for(j=0;j<k;++j) if(x[j] > n) { cout<<"No Soultion"<<endl; return -1; }
14. 嵌套箱问题 15. 套汇问题 16. 信号增强装置问题 17. 磁带最大利用率问题 18. 非单位时间任务安排问题 19. 多元Huffman编码问题 20. 多元Huffman编码变形 21. 区间相交问题 22. 任务时间表问题 23. 最优分解问题 24. 可重复最优分解问题 25. 可重复最优组合分解问题 26. 旅行规划问题 27. 登山机器人问题
return sum;
}
0
123456
-2 -1 0 1 2 3 4 5 621
算法实现题4-12 删数问题
问题描述: 给定n 位正整数a,去掉其中任意k≤n 个数字后,剩下
的数字按原次序排列组成一个新的正整数。对于给定的 n位正整数a 和正整数k,设计一个算法找出剩下数字组 成的新数最小的删数方案。 编程任务:
int i=0,j=0; while(i < n){
su
求和数组
st[j] += x[i];
01
su[j] += st[j]; ++i,++j;
1 12
if(j == s) j=0; i 0 1 2 3 4 5 6 7 8 9
}
x 1 12 33 55 56 99 99 234 812 1000
double t=0; for(i=0;i<s;++i) t += su[i];