第4章-贪心算法-习题

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

}
return n; }
//所有的程序都没有磁带长
i 012345
x 2 3 8 13 20 80
贪心策略:最短程序优先
排序后的数据
8
算法实现题4-6 最优服务次序问题
问题描述: 设有n 个顾客同时等待一项服务。顾客i需要的服务
时间为ti, 1<=i <= n 。应如何安排n个顾客的服务次序 才能使平均等待时间达到最小?平均等待时间是n 个 顾客等待服务时间的总和除以n。 编程任务:
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个,最近下降点优先
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;
对于给定的n个顾客需要的服务时间,编程计算最 优服务次序。
9
算法实现题4-6 最优服务次序问题
数据输入: 第一行是正整数n,表示有n 个顾客。接下来的1行
中,有n个正整数,表示n个顾客需要的服务时间。 结果输出:
计算出的最小平均等待时间。 输入示例 10
56 12 1 99 1000 234 33 55 99 812 输出示例
18
算法实现题4-10 区间覆盖问题
问题描述: 设x1 , x2 ,... , xn 是实直线上的n个点。用固定长度
的闭区间覆盖这n个点,至少需要多少个这样的固定 长度闭区间?设计解此问题的有效算法。 编程任务:
对于给定的实直线上的n个点和闭区间的长度k,编 程计算覆盖点集的最少区间数。
19
算法实现题4-10 区间覆盖问题
算法实现题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);
对于给定的正整数a,编程计算删去k个数字后得到的 最小数。
22
算法实现题4-12 删数问题
数据输入: 文件的第1 行是1 个正整数a。第2 行是正整数k。
结果输出: 计算出的最小数。
输入示例 178543 4 输出文件示例
13
23
算法实现题4-12 删数问题
void delek(string a, int k) { //在整数a中删除k个数字
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
结果输出:
对每个测试数据项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
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]};
对于给定的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章 贪心算法
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. 数列极差问题
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];
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
return sum;
}
0
123456
-2 -1 0 1 2 3 4 5 621
算法实现题4-12 删数问题
问题描述: 给定n 位正整数a,去掉其中任意k≤n 个数字后,剩下
的数字按原次序排列组成一个新的正整数。对于给定的 n位正整数a 和正整数k,设计一个算法找出剩下数字组 成的新数最小的删数方案。 编程任务:
算法实现题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;
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());
数据输入:
第一行有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 区间覆盖问题
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 结束。
26
算法实现题4-15 套汇问题
while(1){
cin >> n;
if(n == 0) break;
//输入结束
for(i=0; i < n; ++i) cin >> name[i];
数据输入
第1行有2个正整数n和k,表示汽车加满油后可行驶nkm, 且旅途有k个加油站。接下来的一行中,有k+1个整数,表示 第k个加油站与第k-1个加油站之间的距离。第0个加油站表 示出发地,汽车已加满油。第k+1个加油站表示目的地。
结果输出
计算出的最少加油次数。如果无法到达目的地,则输 出”No Solution”。
定义:
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;
}
Baidu Nhomakorabea
i 01234567 8 9
x 1 12 33 55 56 99 99 234 812 1000
}
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美元。
加 1 13 46 101 157 256 355 589 1401 240111
算法实现题4-7 多处最优服务次序问题
问题描述: 设有n 个顾客同时等待一项服务。顾客i需要的服务
时间为ti ,1<= i <= n。共有s 处可以提供此项服务。 应如何安排n 个顾客的服务次序才能使平均等待时间 达到最小?平均等待时间是n个顾客等待服务时间的总 和除以n。 编程任务:
输入示例 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; }
3
算法实现题4-5 程序存储问题
问题描述: 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。
程序i存放在磁带上的长度是 li,1 ≤ i ≤ n。 程序存储问题要求确定这n 个程序在磁带上的一个
存储方案,使得能够在磁带上存储尽可能多的程序。 编程任务:
对于给定的n个程序存放在磁带上的长度,编程计 算磁带上最多可以存储的程序数。
排序后的数据
t /= n;
return t; }
14
算法实现题4-9 汽车加油问题
问题描述 一辆汽车加满油后可行驶nkm 。旅途中有若干个加
油站。设计一个有效算法,指出应在哪些加油站停靠 加油,使沿途加油次数最少。 编程任务
对于给定的n和k个加油站位置,编程计算最少加油 次数。
15
算法实现题4-9 汽车加油问题
14. 嵌套箱问题 15. 套汇问题 16. 信号增强装置问题 17. 磁带最大利用率问题 18. 非单位时间任务安排问题 19. 多元Huffman编码问题 20. 多元Huffman编码变形 21. 区间相交问题 22. 任务时间表问题 23. 最优分解问题 24. 可重复最优分解问题 25. 可重复最优组合分解问题 26. 旅行规划问题 27. 登山机器人问题
相关文档
最新文档