每一次都從前往后找 找到第一個數滿足 它自己的后一位比前一位大的數 然后刪去 因為對于一個位數已知的數來說 位數越靠前 對它值的大小影響越大 (這是可以有嚴格數學證明的)
//例1、刪數問題(delete.cpp NOI94)//洛谷 P1106 刪數問題 //2017.3.6#include <cstdio>#include <iostream>#include <string>#include <cstring>using namespace std;string s; //正整數S int n; //刪去n個int p = 0;int main(){ cin >> s >> n; s.insert(s.length(), "0"); //在結尾加上一個0 以便比較// cout << s << endl; //去除前導0 while (s[0] == '0') s.erase(0, 1);// cout << s << endl; while(n){ n--; for (int i = 0; i < s.length(); i++){// cout << s[i] << " " << s[i + 1] << endl; if (s[i] > s[i + 1]){ s.erase(i, 1);// cout << s << endl; break; } } }// cout << s << endl; s.erase(s.length() - 1, 1); //去掉0// cout << s << endl; //去除前導0 while (s[0] == '0') s.erase(0, 1); cout << s; return 0;}有點要注意: 1. “高精度的正整數”不用怕 字符串輸入輸出即可 2. 可以先在結尾加上一個0 以便比較 (最后勿忘刪去) 3. 特別注意前導0 (大坑) 不論是一開始讀入時 還是輸出時 4. str.erase(pos, k) 刪去字符串str中從pos位開始的k個數 P.s: 關于字符串的小操作
新聞熱點
疑難解答