Divide by Three

CodeForces - 792C

有一个正整数 n 写在黑板上。它有不超过 105 位。 你需要通过删除一些位使得他变成一个美丽的数,并且需要删除尽量少的位数。删除的位不一定要连续。

称一个数为美丽的当且仅当这个数不包含前导0并且是 3 的倍数。举个例子,0, 99, 10110 是美丽的数,但 00, 03, 122 不是。

如果没有方案,输出 -1。 如果有多种方案输出任意一种。

Input
1033
Output
33
Input
10
Output
0
Input
11
Output
-1

题解:

要让一个数是美丽的,有两种方案:

M=(a[1]+a[2]+a[3]+....+a[n])%3

(1)删除一个数,这个数满足 a[i]%3=M

(2)删除两个数,这两个数满足 a[i]%3==3-M

同时注意要判断存在前导零的情况和删除数字后串为空的情况。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int L, M, i, j, W, A[100000];
bool C;
string S, R;
int main () {
cin>>S;
L=S.length();
for (i=0;i<L;i++) {
A[i]=S[i]-'0';
M=(M+A[i])%3;
}
if (M==0) {//不用进行删除
cout<<S<<'\n';
return 0;
}
for (i=1;i<L;i++) {//从第二个数字开始 选择删除一个数字
if (A[i]%3==M) {
for (j=0;j<i;j++) {
cout<<A[j];
}
for (j=i+1;j<L;j++) {
cout<<A[j];
}
cout<<'\n';
return 0;
}
}
if (A[0]%3==M&&A[1]!=0) {//还是删除一个数字(模3为M),这种情况是第二个数字不为0并且可以删除第一个
for (j=1;j<L;j++) {
cout<<A[j];
}
cout<<'\n';
return 0;
}
for (i=L-1;i>=0;i--) {//删除两个数字(均是模3为3-M) 或更多
if (A[i]%3==3-M) {
if (W) {//判断有两个可删数字
for (j=0;j<L;j++) {
if (j!=W&&j!=i) {//删除两个及以上,可能有前导零
if (A[j]) {
C=1;
cout<<A[j];
}
else if (C) {
cout<<0;
}
}
}
if (!C) {
if (L<3) {
cout<<-1<<'\n';
}
else {
cout<<0<<'\n';
}
}
return 0;
}
else {
W=i;
}
}
}
if (A[0]%3==M) {//删除一个数字或更多 这种情况是第一个数字是模3为M,第二个数字为0。这里先删除第一个数字
for (j=1;j<L;j++) {
if (A[j]) {//可能有前导零
C=1;
cout<<A[j];
}
else if (C) {
cout<<0;
}
}
if (!C) {
if (L==1) {
cout<<-1<<'\n';
}
else {
cout<<0<<'\n';
}
}
}
return 0;
} /*
//这代码的选择删除 模M 或 模3-M 的顺序很重要, 最后两种方法如果换个先后顺序就错了,比如这组数据
//20000111
//200001
//之前我的做法是同时进行两种删除方法,通过判断哪种方法删除数字更少,来选择输出更优的那个,而这个代码则不用比较两种情况,直接按这种顺序输出就行
*/

CodeForce-792C Divide by Three(数学)的更多相关文章

  1. codeforces 792C. Divide by Three

    题目链接:codeforces 792C. Divide by Three 今天队友翻了个大神的代码来问,我又想了遍这题,感觉很好,这代码除了有点长,思路还是清晰易懂,我就加点注释存一下...分类吧. ...

  2. CodeForces - 792C Divide by Three (DP做法)

    C. Divide by Three time limit per test: 1 second memory limit per test: 256 megabytes input: standar ...

  3. [codeforces Mail.Ru Cup 2018 Round 3][B Divide Candies ][思维+数学]

    https://codeforces.com/contest/1056/problem/B 题意:输入n,m    求((a*a)+(b*b))%m==0的(a,b)种数(1<=a,b<= ...

  4. CodeForces 792C - Divide by Three [ 分类讨论 ]

    删除最少的数位和前缀0,使得剩下的数能被3整除 等价于各数位数字之和能被3整除. 当前数位和可能是 0, 1, 2(mod 3) 0: 直接处理 1: 删除一个a[i]%3 == 1 或者 两个a[i ...

  5. Codeforces Round #653 (Div. 3) B. Multiply by 2, divide by 6 (数学)

    题意:有一个数\(n\),每次操作可以使\(n*=2\)或\(n/=6\)(如果能被整除),求最少操作次数使得\(n=1\),如果不满足,输出\(-1\). 题解:我们只要看\(n\)的质因子即可,如 ...

  6. codeforces 792A-D

    先刷前四题,剩下的有空补. 792A New Bus Route 题意:给出x 轴上的n 个点,问两个点之间的最短距离是多少,有多少个最短距离. 思路:排序后遍历. 代码: #include<s ...

  7. Tensorflow常用函数说明(一)

    首先最开始应该清楚一个知识,最外面的那个[ [ [ ]]]括号代表第一维,对应维度数字0,第二个对应1,多维时最后一个对应数字-1:因为后面有用到 1 矩阵变换 tf.shape(Tensor) 返回 ...

  8. 3.26-3.31【cf补题+其他】

      计蒜客)翻硬币 //暴力匹配 #include<cstdio> #include<cstring> #define CLR(a, b) memset((a), (b), s ...

  9. 1305 Pairwise Sum and Divide(数学 ,规律)

    HackerRank   1305 Pairwise Sum and Divide   有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整:   fun(A)     sum = ...

随机推荐

  1. Shell-15-脚本练习

    批量生成随机字符串文件名 # 用for循环在 /test 目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字符加固定字符串 alnk #!/bin/bash ########### ...

  2. ad room 拷贝

    当一个电路图中有多个相同组件的时候,我哦们一般使用 room格式拷贝. 基本思路 1.方法一  电路图使用repeat 多通道设计 2.简易的赋值粘贴,事实证明简单有效. 3.在pcb中删除对应一个单 ...

  3. 从安装到使用——Odoo常见问题及故障处理

    小九今天分享了Odoo一键部署.高效安装的图文详解,接下来,针对Odoo使用过程中的一些问题,小九整理了详细的常见问题问答.这样的直观方式往往能快速高效地解决一些疑惑. 也欢迎提出其他问题,共同探讨, ...

  4. linux下安装redis-6.0.6、配置redis远程连接

    官网下载安装包redis-6.0.6.tar.gz https://redis.io/ 上传到服务器之后使用tar -zxvf进行解压,解压后如下: 进入解压的文件之后我们可以看到他的配置文件(配置文 ...

  5. jpa中遇到关键字

    @Column(name = "`rank`") 或者 @Column(name = "\"use\"")

  6. SpringBoot自定义参数验证器

    前要 之前我们介绍了JSR-303验证方式,十分的方便Spring都帮我们封装好了,但是对一些复杂的验证,还是需要更加灵活的验证器的. JSR-303验证器传送门:https://www.jiansh ...

  7. [ES6深度解析]13:let const

    当Brendan Eich在1995年设计了JavaScript的第一个版本时,他犯了很多错误,包括从那时起就成为该语言一部分的一些错误,比如Date对象和当你不小心将它们相乘时对象会自动转换为NaN ...

  8. WPF 饼状图,柱形图,折线图 (2 折线图)

    折线图在柱形图的基础上,做了一些修改.大概效果和用法如下. X轴和Y轴的刻度,使用用了Path的Figures属性,绘制多条Figure+LineSegment完成. 同时,由于折线图很可能会画多条线 ...

  9. C# AppDomain 详解

    AppDomain 详解 AppDomain是CLR的运行单元,它可以加载Assembly.创建对象以及执行程序. AppDomain是CLR实现代码隔离的基本机制.每一个AppDomain可以单独运 ...

  10. Semaphore 的使用思路

    转自:https://www.cnblogs.com/klbc/p/9500947.html 最近在看一本书<Java并发编程 核心方法与框架>,打算一边学习一边把学习的经验记下来,所粘贴 ...