算法第四章作业
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. 请说明在本章学习过程中遇到的问题及结对编程的情况
遇到的问题:选择的贪心算法不正确/想不到适合的贪心策略
结对编程情况:独立编程,互相查缺补漏,提出测试点,对同一方法给出细节上不同的实现方法,拓宽了思路