第四章算法作业
贪心算法
个人理解是多多益善的情况,尽量找出满足条件的情况。
删数问题
题意
删数问题要求在一个正整数中删去 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;
}
结对编程遇到的问题
- 代码写出来了却有的时候没法跟队友解释清楚
- 和队友配合的越来越有默契~