您的位置:首页 > 其它

792C - Divide by Three

2017-03-29 10:56 197 查看
题意:有个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: