091马晨恺 - 贪心练习4 - 数位删减 - TLE原因
public
Apr 28, 2025
Never
8
1 /* 2 总时间复杂度 O(T X^2) TLE, 3 考虑优化: 4 1、如果不限制前导 0,维护一个 单调栈/单调队列即可 5 a、如果栈是空的,直接放入元素 6 b、如果栈非空, 7 循环判定 8 如果,当前元素比栈顶 小,就删除栈顶元素,k-- 9 否则,循环结束 10 当前元素进栈 11 12 2、限制前导 0, 即 最后 0 不能成为第一位的 数 13 a、可知,前 k 位的最小非零数,一定是答案的开头; 14 b、记录这个数的位置,之前的全部删除,然后输出这个数 15 c、然后,就 可以 按第一种情况处理了 16 */ 17 #include<bits/stdc++.h> 18 using namespace std; 19 int t,k; 20 string s,h; 21 int main(){ 22 cin>>t; 23 while(t--){ // O(T) 24 cin>>s>>k; 25 h=s; 26 char minn; 27 while(k>0){ 28 for(int i=0;i<s.size()-1;i++){ // O(X) 29 if(k>0&&s[i]>s[i+1]&&!(s[i+1]=='0'&&i==0)){ 30 s.erase(i,1); // O(X) 该算法,需要遍历字符串 31 k--; 32 break; 33 } 34 if(k>0&&i==s.size()-2){ 35 s.erase(i+1,1); 36 k--; 37 } 38 } 39 } 40 cout<<s<<"\n"; 41 } 42 return 0; 43 } 44