键盘输入一个高精度的正整数 NN(不超过 250250 位),去掉其中任意 kk 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 NN 和 kk,寻找一种方案使得剩下的数字组成的新数最小。
输入格式nn(高精度的正整数 )。
kk(需要删除的数字个数 )。
输出格式最后剩下的最小数。
输入输出样例输入 #1复制
175438 4
输出 #1复制
13
ps:第一次理解错题意,把输入的数按照升序进行排列,然后输出,得分44
代码如下
#include#include #include using namespace std; bool cmp(int x, int y) { return x < y; } int main() { char a[255]; int n; cin >> a; cin >> n; int len = strlen(a); sort(a, a + len, cmp); for (int i = 0; i < len - n; i++) { cout << a[i] - '0'; } return 0; }
PS:第二次参考别人的思路删除前面的驼峰例如0 1 0 删除1,后面的往前移,但是没有考虑数字为单调不减的情况,例如1233556,wa了一个,得分86
代码如下:
#include#include using namespace std; int main() { char a[255]; cin >> a; int len = strlen(a), n = 0; cin >> n; while (n--) { for (int i = 0; i < len - 1; i++) { if (a[i] > a[i + 1]) { for (int j = i; j < len - 1; j++) { a[j] = a[j + 1]; } len--; break; } } } int det = 0; for (int i = 0; i < len - 1; i++) { if (a[i] == '0')det++; else break; } for (int i = det; i < len; i++) cout << a[i]; return 0; }
PS:这一次对上述问题进行了改进,AC
代码如下
#include#include using namespace std; int main() { char a[255]; cin >> a; int len = strlen(a), n = 0, m = len; cin >> n; int s1 = n; while (n--) { for (int i = 0; i < len - 1; i++) { if (a[i] > a[i + 1]) { for (int j = i; j < len - 1; j++) { a[j] = a[j + 1]; } len--; break; } } } int s = s1-(m - len); while (s--) { int max = 0, index = 0; for (int i = 0; i < len; i++) { if (max < a[i]) { max = a[i]; index = i; } } if (index + 1 < len) { for (int i = index; i < len - 1; i++) { a[i] = a[i + 1]; } len--; } else len--; } int det = 0; for (int i = 0; i < len - 1; i++) { if (a[i] == '0')det++; else break; } for (int i = det; i < len; i++) cout << a[i]; return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)