1.你对贪心算法的理解
贪心算法是通过局部全优解来得到全局最优解的,每一步都是在当前状态下做出最好选择。在用贪心算法时,一般都需要排序。需要找出多种贪心策 略,通过找出反例来验证其可行性。
2.请选择一道作业题目说明你的算法满足贪心选择性质
题目描述:4-2 删数问题
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法 找出剩下数字组成的新数最小的删数方案。
解题思路:
从数组的左边开始向右扫描,若是找到单调递减序列,就把这个序列的第一个数字删除,数组后面的数依次往前挪,长度-1;
若是找不到递减序列,就把非递减序列的最后一个数删掉,它为大数;
在删除个数仍小于k的情况下,重复以上步骤。
最后控制输出格式,从左开始扫描数组,直到去掉开头的‘0’,如‘001’的情况。
代码:
#include <iostream>
#include <string.h>
using namespace std;
char a[1002];
int k;
bool flag = false;
int t = 0;
int len ;
int sum = 0;
int deal()
{
while(k > 0)
{
for(int i=0; i<len; i++)
{
if (i == len - 1) {
len--;
break;
}//没找到那个单调递减的第一个数,就删掉非递减序列的最后一个数。
else if (a[i] > a[i + 1])
{
for (int j = i; j < len - 1; j++) {
a[j] = a[j + 1]; //删掉一个,后面的全部前移一位。
}
len--; //长度减一
break;
}
}
k--;
}
return len;
}
int main()
{
cin >> a;
cin >> k;
len = strlen(a);
int m = deal();
int j = 0;
while(j < (m-1) && a[j] == '0'){
j++;
}
for(int i=j; i<m; i++)
{
cout << a[i];
}
}
3.请说明在本章学习过程中遇到的问题及结对编程的情况
情况良好,本次结对编程交流了挺多思路,发现了许多以前没注意到的小细节。
浙公网安备 33010602011771号