算法第四章作业

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

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

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

 

4-2 删数问题 (110分)

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

输入格式:

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

输出格式:

输出最小数。

输入样例:

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

178543 
4 

输出样例:

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

13
 1 /*
 2 7-51 删数问题 (110分)
 3 
 4 给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
 5 输入格式:
 6 第 1 行是1 个正整数 a。第 2 行是正整数k。
 7 输出格式:
 8 输出最小数。
 9 输入样例:
10 在这里给出一组输入。例如:
11 178543 
12 4 
13 
14 输出样例:
15 在这里给出相应的输出。例如:
16 13
17 */
18 #include<bits/stdc++.h>
19 using namespace std;
20 int main ()
21 {
22     int p = 0 , n , k , y , i = 0 , w[9999] = {0};
23     string a;
24     cin >> a >> n;
25     int j ;
26     j = a.length();
27     i = j;
28     for(p = 0 ; a[p] == '0' ; p++);
29     
30     j = i - p;
31     for(int x = 0 ; x < i ; p++ , x++)
32         w[x] = a[p] - '0';
33 //    for(int v = 0 ; v < j  ; v++)
34 //            cout<<w[v];
35 //        cout<<endl;
36     for(int x = 1 ; x <= n ; x++ )//每次删一个数,删n次
37     {
38         for( y = 0 ; y < j  - x ; y++)//先找到第一个降序
39         {
40 //            if(y == 0 && w[1] == 0 )
41 //                continue;
42             if(w[y] > w[y+1])
43                 break;
44         } 
45         while(y < j - 1)
46         {
47             w[y] = w[y+1];
48             y++;
49         }
50 //        for(int v = 0 ; v < j - x ; v++)
51 //            cout<<w[v];
52 //        cout<<endl;
53     } 
54     for(k = 0 ; w[k]==0 ; k++ );
55     for(int x = k ; x < j - n ; x++)
56     {
57         cout<<w[x];
58     }
59         
60         
61         
62     return 0;
63 }

算法:找到输入的整数中第一组降序的两个数,删去高位,若该整数所有数都是非降序排列,则删去最后一位数

要使一个已知位数的数尽可能的小,就要使该数高位尽可能小,从高位往低位遍历该数,优先使高位变小。

假设先删低位,那么删后的数一定比先删高位的数要大

 

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

 

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

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

 

posted @ 2020-11-15 01:22  HaLi_Kui  阅读(79)  评论(0编辑  收藏  举报