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. .NetCore+OpenSSL实现Https

    前言 最近,有时间研究了一下HTTPS安全通信的原理,感兴趣的同学可以看下上一篇博文深入理解Https如何保证通信安全 ,随即联想到近段时间开发的.NetCore项目,.NetCore API应用程序 ...

  2. Special Forms and Syntax Sugars in Clojure

    (...): function literals, p40, 64; '(...): suppress evaluation, p24; _(...): comments, p18; ".. ...

  3. Java调用Zookeeper

    watch机制 Zookeeper watch是一种监听通知机制,可以随时监听一些数据的变化,从而实现数据的及时性. Zookeeper所有的读操作getData(), getChildren()和 ...

  4. 三个线程按循序一个打印A一个打印B一个打印C 循环打印?

    第一种 public static volatile int flag = 1; public static void printABC1(){ Thread t1 = new Thread(() - ...

  5. UWP App Data存储和获取

    这篇博客介绍如何在UWP开发时,如何存储App Data和获取. App Data是指用户的一些设定,偏好等.例如,App的主题,是否接收推送,离线接收消息等.需要区分下App Data和User D ...

  6. 深入浅出Mybatis系列(九)---缓存

    MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存. 1.默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启. 2.二级缓存需要手动开启和配置,他是基于namesp ...

  7. 关于struts中Ognl和iterator配合再次理解

    Person.jsp (struts.xml中省略) package com.mzy.entity; public class Person { private String name; privat ...

  8. Python - 面向对象编程 - 什么是 Python 类、类对象、实例对象

    什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html Python 类 类定义语法 最简单的类定义看起来像这样 class ClassName: ...

  9. openstack新建实例各种报错解决

    最近自己装了下Openstack,零基础安装,参照了网上不少教程. 吃了百家饭的后果,就是出现了一堆不明问题...openstack安装比较复杂,很多配置文件,一个地方配置不正确,可能会导致后面的功能 ...

  10. js函数和封装

    $就是jquery对象,$()就是jQuery(),在里面可以传参数,作用就是获取元素 js对象与jQuery对象的区别:jQuery对象是一个数组,jQuery对象转为js对象:[0] 取第一个即可 ...