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. 使用VNC远程安装CentOS 7操作系统

    使用VNC远程安装CentOS 7操作系统 by 无若 数据中心一般都不在本地,如果希望重新安装系统,难道还要跑到数据中心...所以必须要有一种方式来远程解决这个问题. 目前CentOS 7主要使用的 ...

  2. MySQL Replication Thread States

    1.主节点线程状态(Replication Master Thread States): Finished reading one binlog; switching to next binlog 线 ...

  3. 从零开始实现简单 RPC 框架 2:扩展利器 SPI

    RPC 框架有很多可扩展的地方,如:序列化类型.压缩类型.负载均衡类型.注册中心类型等等. 假设框架提供的注册中心只有zookeeper,但是使用者想用Eureka,修改框架以支持使用者的需求显然不是 ...

  4. 用Matlab求解微分方程

    用Matlab求解微分方程 解微分方程有两种解,一种是解析解,一种是数值解,这两种分别对应不同的解法 解析解 利用dsolve函数进行求解 syms x; s = dsolve('eq1,eq2,.. ...

  5. JAVA 调用第三方短信平台接口发送短信

    做了几个调用三方短信平台发送短信的例子,大部分需要 携带参数,向指定URL发送请求 回顾对接第一个平台时痛苦的乱码经历,这里放一份代码,算是个模版,再用到的时候过来copy一下就OK. 在进入主题之前 ...

  6. Java-Dubbo学习及整合SpringBoot

    Dubbo架构 Dubbo是Java的RPC框架,具有三大核心功能:面向接口的远程方法调用,智能容错和负载均衡,以及服务的自动注册和发现 Dubbo架构图: 节点角色说明: 节点 说明 Provide ...

  7. Future有返回值的线程

    //创建一个线程池 ExecutorService pool = Executors.newFixedThreadPool(100); //创建多个有返回值的任务 List<Future> ...

  8. docker 镜像配置

    Ubuntu14.04.Debian7Wheezy 对于使用 upstart 的系统而言,编辑 /etc/default/docker 文件,在其中的 DOCKER_OPTS 中配置加速器地址: DO ...

  9. chmod u+s是什么意思

    今天突然不能su到root了,root密码是正确的,但是就是显示密码错误还有mount也不能在一般用户里用了,不管有没有设备,都说没有权限到google上搜索了一番,发现了这样一段:--------- ...

  10. 十四:Servlet3.0的动态

    动态的创建是为了简化配置文件的.对于我们创建的servlet,filter和listener后可以使用.这也是注解的另外一种替代方式. package com.hotusm.dynamic; impo ...