题目描述
LYK拥有一个十进制的数N。它赋予了N一个新的意义:不考虑N的符号,将N每一位都拆开来后再加起来就是N所拥有的价值。例如数字123拥有6的价值,数字999拥有27的价值,数字-233拥有8的价值。
假设数字N的价值是K,LYK想找到一个价值是K+1的数字,当然这个答案实在太多了,LYK想使得这个价值为K+1的数字尽可能大,并且需要保证这个数字小于N。

输入格式(bit.in)
一个整数N。

输出格式(bit.out)
一个数表示答案。你需要输出一个整数,且这个数不包含前导0。

输入样例1
199

输出样例1
-299

输入样例2
1520

输出样例2
1512

对于20%的数据|N|<=10
对于40%的数据|N|<=100
对于60%的数据|N|<=10^9
对于80%的数据|N|<=10^1000
对于100%的数据|N|<=10^100000。

分析:其实就是一道比较恶心的讨论题.如果|N| <= 100000(甚至可以更大),可以暴搜。如果N是负数,从后往前第一位不是9的数上+1,如果N不是负数,那么肯定存在一个第i位,第i位上的数-1,第i位后面的数分摊+2,再把后面的数重新组合一下,把尽量多的数分摊在前面的位上。如果不存在这么一个第i位,那么最后输出的肯定是一个负数,第一位++,添上负号就可以了.如果第一位是9,就在前面补上1,总之就是非常非常麻烦的讨论,我在考场上写了一个骗分程序,结果范围看错了,数组开小了只得了60分QAQ.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int sizee;
bool flag = false, flg = false, flg8 = false;
char s[]; bool check(long long x, long long k)
{
long long res = ;
while (x)
{
res += x % ;
x /= ;
}
if (res == k)
return true;
return false;
} int main()
{
scanf("%s", s + );
sizee = strlen(s + );
if (s[] == '-')
flg = ;
if (!flg)
{
int tot = ;
for (int i = ; i <= sizee; i++)
if (s[i] == '')
tot++;
if (tot >= sizee - )
flg8 = ;
}
if (sizee == && !flg)
{
if (s[] == '')
printf("-19\n");
else
printf("%c", s[] + );
}
else
if (sizee <= )
{
long long num = , k = ;
if (!flg)
{
for (int i = ; i <= sizee; i++)
{
num = num * + s[i] - '';
k += s[i] - '';
}
}
else
{
for (int i = ; i <= sizee; i++)
{
num = num * + s[i] - '';
k += s[i] - '';
}
num = -num;
}
if (num == -)
printf("-1999999");
else
{
while ()
{
num--;
if (check(abs(num), k + ))
{
printf("%lld\n", num);
break;
}
}
}
}
else
if (flg8 && !flg)
{
s[sizee]++;
s[sizee - ]++;
s[sizee - ]--;
for (int i = ; i <= sizee; i++)
printf("%c", s[i]);
printf("\n");
}
else
{
if (flg)
{
for (int i = sizee; i >= ; i--)
{
if (s[i] != '')
{
flag = ;
s[i]++;
break;
}
}
if (flag)
{
for (int i = ; i <= sizee; i++)
printf("%c", s[i]);
printf("\n");
}
else
{
printf("-1");
for (int i = ; i <= sizee; i++)
printf("%c", s[i]);
printf("\n");
}
}
else
{
//
int sum = ;
for (int i = sizee; i >= ; i--)
{
if (s[i] >= '' && sum >= )
{
s[i]--;
sum = ;
for (int j = i + ; j <= sizee; j++)
{
while (sum && s[j] < '')
{
sum--;
s[j]++;
}
}
int cnt = ;
for (int j = i + ; j <= sizee; j++)
cnt += s[j] - '';
for (int j = i + ; j <= sizee; j++)
{
if (cnt >= )
{
s[j] = '';
cnt -= ;
}
else
{
s[j] = cnt + '';
cnt = ;
}
}
flag = ;
break;
}
sum += '' - s[i];
}
if (flag)
{
for (int i = ; i <= sizee; i++)
printf("%c", s[i]);
printf("\n");
}
//
else
{
if (s[] != '')
{
s[]++;
printf("-");
for (int i = ; i <= sizee; i++)
printf("%c", s[i]);
printf("\n");
}
else
{
printf("-1");
for (int i = ; i <= sizee; i++)
printf("%c", s[i]);
printf("\n");
}
}
}
}
return ;
}

清北学堂模拟赛d2t2 位运算2(bit)的更多相关文章

  1. 清北学堂模拟赛d1t1 位运算1(bit)

    题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ...

  2. 清北学堂模拟赛d1t6 或和异或(xor)

    题目描述 LYK最近在研究位运算,它研究的主要有两个:or和xor.(C语言中对于|和^) 为了更好的了解这两个运算符,LYK找来了一个2^n长度的数组.它第一次先对所有相邻两个数执行or操作,得到一 ...

  3. 清北学堂模拟赛d6t4 数组异或

    分析:直接O(n^3)做是只有50分的,可以加一点小小的优化,就是c[k]可以从c[k-1]得到,但是还是只有60分,从宏观意义上是不能继续优化了.对于这类涉及到位运算的性质的题目,将每个数转化成二进 ...

  4. 清北学堂模拟赛d4t1 a

    分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...

  5. 清北学堂模拟赛day7 数字碰撞

    /* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...

  6. 清北学堂模拟赛d6t6 棋盘迷宫

    3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...

  7. 清北学堂模拟赛d1t2 火柴棒 (stick)

    题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ...

  8. 清北学堂模拟赛d2t6 分糖果(candy)

    题目描述总共有n颗糖果,有3个小朋友分别叫做L,Y,K.每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感.也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果 ...

  9. 清北学堂模拟赛d1t4 一道图论好题(graph)

    题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,不仅有边权还有点权. LYK给出了一个子图的定义,一张图G’={V’,E’}被称作G的子图,当且仅当 ·G ...

随机推荐

  1. html5拨打电话及发短信

    1.最常用WEB页面一键拨号的电话拨打功能 <a href="tel:15088888888">拨号</a> 2.最常用WEB页面一键发送短信功能: < ...

  2. K8S之利用Label控制Pod位置

    首先介绍下什么是Label? Label是Kubernetes系列中一个核心概念.是一组绑定到K8s资源对象上的key/value对.同一个对象的labels属性的key必须唯一.label可以附加到 ...

  3. css的一些命名规范

    网页制作中规范使用DIV+CSS命名规则,可以改善优化功效特别是团队合作时候可以提供合作制作效率,具体DIV CSS命名规则CSS命名大全内容篇. 常用DIV+CSS命名大全集合,即CSS命名规则 D ...

  4. curl 采集的时候遇到301怎么办

    采集的时候遇到301,采集数据有错误 $ch = curl_init($url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt( ...

  5. $Vijos P1250$

    背包? 跑完并查集 分组背包完事 #include <bits/stdc++.h> #define rep(i,j,n) for(register int i=j;i<=n;i++) ...

  6. dubbo+zookeeper下生产者和消费者配置(基于springboot开发)

    一.总共分为三个目录: dubbo-api      服务的接口用于对接客户端和服务端 dubbo-client     客户端配置文件为:consumer.xml dubbo-service  服务 ...

  7. 对于民科吧s5_or吧友自增树的复杂度计算

    原帖 自增树如s5_or所说,是一种思想像Splay的数据结构,每个节点维护一个堆权值,每当询问一个节点时,堆权值++,并返回时维护堆权值为堆的性质.这个树从旋转次数上比Splay小是肯定的,因为Sp ...

  8. mongoDB的基本用法

    一.MongoDB初识 什么是MongoDB MongoDB是一个基于分布式文件存储的数据库.由c++语言编写.旨在为web应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库 ...

  9. EF 批量插入,sqlhelper 批量插入

    需添加一个using System.Linq; 引用 public void BulkInsert<T>(string connection, string tableName, ILis ...

  10. ssh项目导入报the import javax.servlet cannot be resolved

    在做javaWeb项目时,我们经常会出现丢失包的情况,如下图所示的错误,我们应该怎么解决呢? 根据网上教程向工程中加入tomcat的servlet-api.jar和jsp-api.jar的包 此时项目 ...