传送门

还是猜结论呢

然后我们就想我们可以每次去掉尽量多的位数来保证次数最小,假装这是对的,先写一发,A了

考虑如何去掉尽量多的位数,我们可以找到最大的几位的不下降序列,把最后一个-1,后面全部改成9,这样我们就得到了一个每次去掉数字最前的一个不下降序列,然后将最后一位+1的做法

然后发现有一种情况是不合法的,举个例子:166621

这样我们第一次如果是找不下降序列,就会找到1666,减掉1后就是1665,这就不是不下降了,我们只能取159999,所以对于这种最后一位和倒数第二位是相同的不下降序列,我们要特判一下

所以考虑暴力去找最后一位数字在和他这个块里第一个位置,那么复杂度就可以到\(O(n^2)\)

考虑怎么优化,我们发现我们找到这样一个块之后,对于块内的每个元素每次都重新去找一遍这个块是不必要的,记下这个块就好了

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
void read(long long &x){
char ch;bool ok;
for(ok=0,ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')ok=1;
for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if(ok)x=-x;
}
#define rg register
const int maxn=5e5+10;
char a[maxn];int ans,n,s[maxn],w[10];
int main(){
scanf("%s",a+1);n=strlen(a+1);
for(rg int i=1;i<=n;i++)s[i]=a[i]-'0';
int k=0;
for(rg int i=1;i<=n;i++){
int las=n,d=i;
if(s[k+1]>=s[k])k=0;
for(rg int j=d+1;j<=n;j++){
if(s[j]<s[j-1]){las=j-1;break;}
if(k>=j&&s[j]==s[j-1]){las=j-1;break;}
}
if(las==n){ans++;break;}
if(s[las]==s[las-1]){
k=las;
for(rg int j=las;j;j--)if(s[j]!=s[j-1]){las=j;break;}
}
ans++,s[n]++;
int now=n;s[i]=s[las]=0;
while(now&&s[now]>=10)s[now-1]+=s[now]/10,s[now]%=10,now--;
i=las;
}
printf("%d\n",ans);
}

AT2341 Increasing Numbers的更多相关文章

  1. 【AtCoder】AGC011 E - Increasing Numbers

    题解 题是真的好,我是真的不会做 智商本还是要多开啊QwQ 我们发现一个非下降的数字一定可以用不超过九个1111111111...1111表示 那么我们可以得到这样的一个式子,假如我们用了k个数,那么 ...

  2. [AGC011E] Increasing Numbers [数学]

    题面 传送门 思路 首先,我们观察一下上升数的性质 可以发现,它一定可以表示为最多9个全是1的数字的和 那么我们设$N$可以被表示成$k$个上升数的和,同时我们设$p_i=\underbrace{11 ...

  3. AtCoder Grand Contest 011 E - Increasing Numbers(灵性乱搞)

    题意: 当一个整数高位数字总不小于低位数字,或者说写成字符串之后单调不下降,称之为上升数.求一个整数最少能表示为多少个上升数的和.(n<=1e500000) 分析: 考虑那些不下降的数字,一定可 ...

  4. [agc011e]increasing numbers

    题意: 如果一个十进制非负整数的所有数位从高位到低位是不减的,我们称它为“上升数”,例如1558,11,3,0都是上升数,而10,20170312则不是: 给定整数N,求最小的k使得N能被表示为k个上 ...

  5. AGC011-E Increasing Numbers

    题意 给定一个数\(n\),\(n≤10^{500,000}\),问\(n\)最少可以拆分成几个不降数的和.一个不降数是在十进制位下,从高位往低位看,每个数都不会比高位的数更小的数 做法 不降数可以拆 ...

  6. POJ 1239 Increasing Sequences 动态规划

    题目链接: http://poj.org/problem?id=1239 Increasing Sequences Time Limit: 1000MSMemory Limit: 10000K 问题描 ...

  7. TZOJ 5963 Increasing Sequences(线性DP)

    描述 Given a string of digits, insert commas to create a sequence of strictly increasing numbers so as ...

  8. writing

    1.作文类型和结构2.作文的四个评分标准3.作文的常用句型4.作文的逻辑观点 大作文分为几类:1.A类(Argument): 这类作文实际上是比较常见的,比如:Caring for children ...

  9. [转载]VIM 教程:Learn Vim Progressively

    文章来源:http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/   Learn Vim Progressively   TL ...

随机推荐

  1. poj2661 Factstone Benchmark(大数不等式同取对数)

    这道题列出不等式后明显是会溢出的大数,但是没有必要写高精度,直接两边取对数(这是很简明实用的处理技巧)得: log2(n!)=log2(n)+log2(n-1)+...+log2(1)<=log ...

  2. 1057 Stack (30)(30 分)

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  3. 【Lintcode】363.Trapping Rain Water

    题目: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...

  4. Java中Calendar/SimpleDateFormat/Date常用方法总结

    //获取当前时刻yyyy-MM-dd HH:mm:ss Calendar calendar = Calendar.getInstance(); SimpleDateFormat sdf = new S ...

  5. spark提交异常日志分析

    java.lang.NoSuchMethodError: org.apache.spark.sql.SQLContext.sql(Ljava/lang/String;)Lorg/apache/spar ...

  6. findBug 错误修改指南

      1. EC_UNRELATED_TYPESBug: Call to equals() comparing different types Pattern id: EC_UNRELATED_TYPE ...

  7. Otter入门简介

    一.Otter简介 1.1  otter是什么? otter 译意: 水獭,数据搬运工 语言: 纯java开发 定位: 基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数 ...

  8. Servlet的生命周期以及简单工作原理的讲解

    Servlet生命周期分为三个阶段: 1,初始化阶段              调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段           调用destr ...

  9. Random获取不重复随机数

    Random R = new Random(Guid.NewGuid().GetHashCode());            int i = R.Next(9999);

  10. eclipse个人觉得有用的快捷键

    CTRL+SHIFT+F 自动整理代码格式 CTRL+M 最大/还原当前编辑窗口 CTRL+/ 注释当前行 CTRL+1 快速修复 CTRL+D 删除当前行 SHIFT+ENTER 在当前行前面插入空 ...