AT2341 Increasing Numbers
传送门
还是猜结论呢
然后我们就想我们可以每次去掉尽量多的位数来保证次数最小,假装这是对的,先写一发,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的更多相关文章
- 【AtCoder】AGC011 E - Increasing Numbers
题解 题是真的好,我是真的不会做 智商本还是要多开啊QwQ 我们发现一个非下降的数字一定可以用不超过九个1111111111...1111表示 那么我们可以得到这样的一个式子,假如我们用了k个数,那么 ...
- [AGC011E] Increasing Numbers [数学]
题面 传送门 思路 首先,我们观察一下上升数的性质 可以发现,它一定可以表示为最多9个全是1的数字的和 那么我们设$N$可以被表示成$k$个上升数的和,同时我们设$p_i=\underbrace{11 ...
- AtCoder Grand Contest 011 E - Increasing Numbers(灵性乱搞)
题意: 当一个整数高位数字总不小于低位数字,或者说写成字符串之后单调不下降,称之为上升数.求一个整数最少能表示为多少个上升数的和.(n<=1e500000) 分析: 考虑那些不下降的数字,一定可 ...
- [agc011e]increasing numbers
题意: 如果一个十进制非负整数的所有数位从高位到低位是不减的,我们称它为“上升数”,例如1558,11,3,0都是上升数,而10,20170312则不是: 给定整数N,求最小的k使得N能被表示为k个上 ...
- AGC011-E Increasing Numbers
题意 给定一个数\(n\),\(n≤10^{500,000}\),问\(n\)最少可以拆分成几个不降数的和.一个不降数是在十进制位下,从高位往低位看,每个数都不会比高位的数更小的数 做法 不降数可以拆 ...
- POJ 1239 Increasing Sequences 动态规划
题目链接: http://poj.org/problem?id=1239 Increasing Sequences Time Limit: 1000MSMemory Limit: 10000K 问题描 ...
- TZOJ 5963 Increasing Sequences(线性DP)
描述 Given a string of digits, insert commas to create a sequence of strictly increasing numbers so as ...
- writing
1.作文类型和结构2.作文的四个评分标准3.作文的常用句型4.作文的逻辑观点 大作文分为几类:1.A类(Argument): 这类作文实际上是比较常见的,比如:Caring for children ...
- [转载]VIM 教程:Learn Vim Progressively
文章来源:http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/ Learn Vim Progressively TL ...
随机推荐
- pyglet模块的EventDispatcher(事件派发对象)
事件派发对象用于处理事件的派发与响应,pyglet的window对象正是继承了它才具有处理事件的能力. 步骤: 1.注册事件类型: EventDispatcher.register_event_typ ...
- 【leetcode刷题笔记】Roman to Integer
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...
- 不要使用Android Studio的Git Commit了---->记一次debug
今天下午写了一些代码,吃晚饭时分用Android Studio commit了一下,不知道有没有选择Commit and push,结果刚才代码出bug我想回滚到上个版本的时候,发现Android S ...
- UILabel常见用法
//创建一个UILabel UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(50 , 100 , 200 , 560)]; // ...
- Erlang generic standard behaviours -- gen_server system msg
这是Erlang generic standard behaviors gen_server 分析的系列的最后一篇,主要分析gen_server module 辅助性的功能函数. 在gen_serve ...
- 【P2P网贷新手入门】详解借款标的种类及其风险
不同于国外的网贷平台以信用借款标为主,在中国,我们投资网贷平台会看到多样借款标,而投资人往往弄不清自己投资的标属于什么类型的标,特点怎么样,风险如何. 抵 押 标 定义:借款人用自己的房屋车辆等实物在 ...
- ss1
首先,对系统来一次升级,以解决一些莫名其妙的依赖问题. sudo yum update 然后安装Python-pip. sudo yum -y install python-pip 注意,通过yum包 ...
- 12.Redis Select 命令 - 切换到指定的数据库
转自:http://www.runoob.com/redis/redis-tutorial.html Redis Select 命令用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 ...
- [原]toString()方法的复写作用, 以及打印集合.
java中的每个类的根都是Object的子类. 必然有拥有了Object的所有方法. 在package java.lang.Object源码中: public String toString() { ...
- Matlab零碎知识
1.不定积分的求取 int syms x;%为自变量 f=x.^2; s=int(f,x); 其中显示辅助函数simple()和pretty()