题意:给出一个由0到9数字构成的字符串,要求删去最少的数位,使得这个字符串代表的数能被3整除,同时要求不能有前导零,并且至少有一位(比如数字11,删去两个1后就没有数位了,所以不符合)。如果能够处理出符合要求的字符串,输出之,否则输出-1。

解题思路:(这种题如果让我比赛做肯定写不出来,,细节太多了,磕磕碰碰看着数据改了好几次才勉强过的)

  首先可以想到的就是,要使能被3整除,各数字位的和能被3整除即可。设各数字位和为sum,并且使sum%=3,那么sum就只能是1或者2(如果是0那么直接输出即可),接下来是处理方式:

  sum==1,那么我们可以删去一个模3等于1的数字位,或者删去两个模3等于2的数字位(这个很容易漏)。

  sum==2,可以删去一个模3等于2的数字位,或者删去两个模3等于1的数字位。

  确定了删除方法后,就是处理各不同方法下可能会有的前导零,并且计算它们删去的数字位数,选取最少的作为最终答案。

  处理前导零有大坑!

  1、最简单想到的无非是只删除一个数字位的情况下,如果该数字位是首位,那么后面跟随的0要全部删掉

  2、删除两位数字的情况下,如果其中一个是首位,那么从首位开始的连续零要删掉,如200233;还有!如果从首位开始一直到另一个删除位都是0,那么另一个删除位后面的连续0也要删掉,如20200333;还有!如果一个是首位,另一个是末位,那么至少要留一个0,如20002。

  3、所有的删除操作都注意不要把最后一个0都删掉了使得变成了一个空字符串。

  基本容易踩的坑就上面这些了。如果是比赛现场,这种题还是要尽可能提前把所有情况的想好,最糟糕的情况是,即使后面找到了bug,也不知道怎么改了。

  下面贴出我丑的不能看的代码,,大概哪天有心情了再重写一遍。?

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
#define sqr(x) ((x)*(x))
const int N=1e5+;
char s[N];
int sum;
bool del[N];
int main(){
scanf("%s",s);
int len=strlen(s);
if(len==){
int tmp=s[]-'';
if(tmp%==) puts(s);
else puts("-1");
return ;
}
for(int i=;i<len;i++)
sum+=s[i]-'';
sum%=;
if(!sum){
puts(s);
return ;
}
int cnt2=;
bool flag=false,flag2=false;
//只删一个
for(int i=len-;i>=;i--){
if((s[i]-'')%==sum){
if(i!=){
del[i]=true;
flag=true;
break;
}else{
if(s[i+]!=''){
del[i]=true;
flag=true;
}else{
flag2=true;
cnt2=;
while(s[cnt2]==''&&cnt2<len-) cnt2++;
}
}
}
}
//删两个,仅限于sum==2,找两个1
if(!flag&&len>){
int cnt=;
int tar=sum==?:;
for(int i=len-;i>;i--){
if((s[i]-'')%==tar){
cnt++;
del[i]=true;
if(cnt==) break;
}
}
if(cnt==){
if((s[]-'')%==tar){
if(s[]!=''){
flag=true;
del[]=true;
cnt++;
while(s[cnt]==''&&cnt<len-) del[cnt++]=true;
}else{
del[]=true;
int tmp=;
int lim=len-;
//处理2002这种数据用的判断
while(del[lim]) lim--;
while(s[tmp]==''&&tmp<lim) del[tmp++]=true;
cnt+=tmp;
//处理202003这种数据
if(del[tmp]){
tmp++;
while(s[tmp]==''&&tmp<lim) del[tmp++]=true;
cnt=tmp;
}
}
}
}
if(cnt&&(cnt<=cnt2||!flag2)){
for(int i=;i<len;i++) if(!del[i]){
putchar(s[i]);
}
puts("");
}else{
for(int i=cnt2;i<len;i++)
putchar(s[i]);
puts("");
}
}
else{
if(flag){
for(int i=;i<len;i++) if(!del[i]){
putchar(s[i]);
}
puts("");
}
else if(flag2){
for(int i=cnt2;i<len;i++)
putchar(s[i]);
puts("");
}
else puts("-1");
}
return ;
}

Codeforces 792C的更多相关文章

  1. codeforces 792C. Divide by Three

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

  2. 【codeforces 792C】Divide by Three

    [题目链接]:http://codeforces.com/contest/792/problem/C [题意] 让你删掉最少的数字使得剩下的数字%3==0 [题解] 看代码..内置题解了现在. [完整 ...

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

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

  4. Divide by Three CodeForces - 792C

    A positive integer number n is written on a blackboard. It consists of not more than 105 digits. You ...

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

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

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

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

  7. CodeForce-792C Divide by Three(数学)

    Divide by Three CodeForces - 792C 有一个正整数 n 写在黑板上.它有不超过 105 位. 你需要通过删除一些位使得他变成一个美丽的数,并且需要删除尽量少的位数.删除的 ...

  8. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  9. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

随机推荐

  1. Spring核心技术(一)——IoC容器和Bean简介

    IoC容器和Bean简介 这章包括了Spring框架对于IoC规则的实现.Ioc也同DI(依赖注入).而对象是通过构造函数,工厂方法,或者一些Set方法来定义对象之间的依赖的.容器在创建这些Bean对 ...

  2. vue 安装+下载

    1. npm init -y [生成package.json文件] 2. 增加 "private": true, 3.npm install 4. npm install vue ...

  3. 关于 startup_stm32f10x_hd.s 这个文件的一些说明

    关于 startup_stm32f10x_hd.s 这个文件的一些说明 startup_stm32f10x_hd.s 是一个启动文件,里面是使用汇编语言写好的基本程序,当STM32 芯片上电启动的时候 ...

  4. nyoj 55 懒省事的小明(priority_queue优先队列)

    懒省事的小明 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述       小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种 ...

  5. CodeForces - 459C - Pashmak and Buses

    先上题目+: C. Pashmak and Buses time limit per test 1 second memory limit per test 256 megabytes input s ...

  6. [bzoj3809]Gty的二逼妹子序列_莫队_分块

    Gty的二逼妹子序列 bzoj-3809 题目大意:给定一个n个正整数的序列,m次询问.每次询问一个区间$l_i$到$r_i$中,权值在$a_i$到$b_i$之间的数有多少个. 注释:$1\le n\ ...

  7. Ubuntu 16.04开机进入命令行(tty1)+分辨率调节+字体颜色设置+中文乱码解决(解决虚拟终端Ctrl+Alt+F1分辨率太大)

    一.开机进入命令行模式(tty1) sudo vim /etc/default/grub 把GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”改成GRUB_CMDLIN ...

  8. iptables中增加/删除/查询/修改的基本操作

    虽然在Ubuntu使用了UFW来简化iptables的操作,但是UFW只针对防火墙方面,转发方面没有涉及,所以要弄懂其中的原理,还是必须回归到iptables中.CentOS也是如此.下面是针对ipt ...

  9. Angularjs中添加HighCharts

    一. 添加基本配置 1. 添加指令 angular.module('newApp') .directive('dpHighchart', ['$rootScope', function($rootSc ...

  10. 使用 IAsyncResult 调用异步方法

    .NET Framework 和第三方类库中的类型可以提供允许应用程序在主应用程序线程之外的线程中执行异步操作的同时继续执行的方法.下面几部分介绍了在调用使用 IAsyncResult 设计模式的异步 ...