792C - Divide by Three
阿新 • • 發佈:2018-12-09
題意:有個string ,由數字組成。 你要儘可能少的刪除字元,使得該sting 化的數字能被3整除,輸出 刪除後的任意結果(不含有字首0)。
最多刪除2個非零字元。sum =2時,最多(s[i]%3==1+s[j]%3==1);
sum = 1 ,最多 (s[i]%3==2+s[j]%3==2)%3
(1)如果 sum % 3==0,直接輸出。
(2)s[i]%3 == sum , 直接刪除s[i]
( 3 )存在 兩個 (s[i] + s[k])%3 == sum ,刪除 s[i],s[k] 。 0,3的倍數, s[i] % 3 ==sum ,的不管。
找 s[i] 的時候,從低位往高位走,可以儘量避免字首0的存在。
#include <bits\stdc++.h>
using namespace std;
string s;
vector<string> ans;
string ts(string ex){
int n = ex.size();
int id = 0;
while(id+1<n && ex[id]=='0') id++;
return ex.substr(id);
}
int main(){
cin>>s;
int sum = 0, flag = 0;
int len = s.length();
for (int i=0;i<len;i++){
sum = (sum + s[i]-'0') % 3;
if(s[i] == '0') flag = 1;
}
if(sum==0){
cout<<s<<endl;
return 0;
}
for(int i=len-1;i>=0;i--){
int x = s[i]-'0';
if(x%3 == sum ){
string t = s.substr(0,i) + s.substr(i+1 );
t = ts(t);
if(!t.empty()){
ans.push_back(t);
break;
}
}
}
int k = -1;
for(int i=len-1;i>=0;i--){
int x= s[i]-'0';
if(x%3==0 || x%3 == sum) continue;
if(k==-1) {
k = i;
continue;
}
string str = s.substr(0,i); // 0 i-1
if(i+1 != k) str += s.substr(i+1,k-i-1); // i+1 k-1
if(k+1 < len) str += s.substr(k+1); // k+1
str = ts(str);
if(!str.empty()) {
ans.push_back(str);
};
break;
}
if(ans.empty()) {
if(flag) printf("0\n");
else printf("-1\n");
}
else{
string ss;
int lens = ans.size(), leng = 0;
for(int i=0;i<lens;i++){
if(ans[i].length() > leng ){
ss = ans[i];
leng = ans[i].length();
}
}
cout<<ss<<"\n";
}
return 0;
}