算法第四章作业

1. 你对贪心算法的理解?

  贪心算法将问题分解为多个子问题,然后分别对每一个子问题求最优解,最后将所有子问题的解相加得到原问题的解,在某些时候贪心算法可得原问题的一个最优解,某些时候可得较好的解。

 

2. 请选择一道作业题目说明你的算法满足贪心选择性质

  删数问题 

  给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。

输入格式:

第 1 行是1 个正整数 a。第 2 行是正整数k。

输出格式:

输出最小数。

输入样例:

在这里给出一组输入。例如:

178543 
4 

输出样例:

在这里给出相应的输出。例如:

13

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 
 5 string s;
 6 int a[10005];
 7 int k;
 8 
 9 int main() {
10     cin >>s;
11     cin >>k;
12     int len = s.size();
13     int i, j;
14     
15     for (int i=0; i<len; i++) 
16         a[i] = s[i]-48;
17     
18     for (int n=0; n<k; n++) {    
19         for (i=0; i<len-1; i++) {
20             if (a[i] > a[i+1]) {
21                 for(j=i; j<len-1; j++) 
22                     a[j] = a[j+1];
23                 break;
24             }
25         }
26         len--;
27     }
28     
29     i = 0;
30     while (i<=len-1 && a[i]==0) i++; // 快进到开头不是0
31     
32     if (i == len)
33         cout <<0 <<endl;
34     else
35         for(j=i; j<=len-1; j++)
36             cout <<a[j];
37     
38     return 0;
39 }

算法:

  若前一位大于后一位,则将此前一位删去,将后一位及后面所有数向前挪一位。

  同时,要谨慎的排除开头为零的情况。

 

3. 请说明在本章学习过程中遇到的问题及结对编程的情况

遇到的问题:选择的贪心算法不正确/想不到适合的贪心策略

结对编程情况:独立编程,互相查缺补漏,提出测试点,对同一方法给出细节上不同的实现方法,拓宽了思路



posted @ 2020-11-15 11:11  AkiRaku  阅读(82)  评论(0编辑  收藏  举报