算法第四章作业

Posted on 2020-11-14 18:09  Youthenen  阅读(134)  评论(0编辑  收藏  举报

 

      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.请说明在本章学习过程中遇到的问题及结对编程的情况

   情况良好,本次结对编程交流了挺多思路,发现了许多以前没注意到的小细节。

Copyright © 2022 Youthenen
Powered by .NET 6 on Kubernetes