第四章算法作业

贪心算法

个人理解是多多益善的情况,尽量找出满足条件的情况。

删数问题

题意

删数问题要求在一个正整数中删去 k 个数字使得新的序列构成的数字为最小数。

思路

此问题应该先找出删数之后数变小的情况:即从左到右,如果前一个数大于后一个数,则删去这个数会使整个新的数变小。

做法

可先按照题目给出的 k 个数对整数处理为字符串然后进行一个一个遍历,使用 vector 实现动态删数。此方法为尽可能地删去一个数使得结果最小,符合贪心算法的要求。

code

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int main(){
    int c;
    char num[1000009];
    cin >> num >> c;
    vector<char> n;
    for (int i = 0; i < strlen(num); ++i) {
        n.push_back(num[i]);
    }
    while (c--){
        int flag=0;
        for (int i = 0; i < n.size()-1; ++i) {
            if (n[i]>n[i+1]){
                n.erase(n.begin()+i);
                flag=1;
                break;
            }
        }
        if (!flag) n.erase(n.begin()+n.size()-1);
    }
    int zero = 0;
    for (int j = 0; j < n.size(); ++j) {
        if (n[j]>'0') zero=1;
        if (zero==1) cout << n[j];
    }
    if (n.empty()) cout << 0;
    return 0;
}

结对编程遇到的问题

  • 代码写出来了却有的时候没法跟队友解释清楚
  • 和队友配合的越来越有默契~
posted @ 2020-11-15 08:30  iccyyxx  阅读(134)  评论(0编辑  收藏  举报