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的存在。
最多删除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; }
相关文章推荐
- Codeforces 792C Divide by Three【Dp+记录路径】
- Codeforces-792C:Divide by Three(DP)
- CodeForces 792C - Divide by Three [ 分类讨论 ]
- codeforce 792C - Divide by Three(思维)
- codeforces 792C —— Divide by Three(分类讨论)
- (2017/4、8、/ B - Divide by Three) CodeForces - 792C (dp)(暴力破解)
- codeforeces 792 C. Divide by Three (dp || 贪心)
- Codeforces 729 C. Divide by Three
- Educational Codeforces Round 18 -- C. Divide by Three (贪心)
- [CF792C] Divide by Three(dp,记录路径)
- 【codeforces 792C】Divide by Three
- 792C - Divide by Three
- Introduction to " Divide and Conquer"
- C++修炼笔记----------利用合并排序提升排序效率(分而治之---Divide-Conquer )
- Divide and conquer algorithm
- DIV或Divide命令 等分对象
- [2_1_frac1] Generate Fractions (Divide Top->Down)
- Algorithms Review: Divide and Conquer(Binary Search & Merge Sort)
- UESTC 1711 Divide
- Divide a number by 3 without using *, /, +, -, % operators