题目描述
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. P3092 [USACO13NOV]没有找零No Change 状压dp

    这个题有点意思,其实不是特别难,但是不太好想...中间用二分找最大的可买长度就行了. 题干: 题目描述 Farmer John <= K <= ), each with value .., ...

  2. JSP-Runoob:JSP 动做元素

    ylbtech-JSP-Runoob:JSP 动做元素 1.返回顶部 1. JSP 动作元素 与JSP指令元素不同的是,JSP动作元素在请求处理阶段起作用.JSP动作元素是用XML语法写成的. 利用J ...

  3. 杂项-java:ElasticSearch

    ylbtech-杂项-Java:ElasticSearch 1.返回顶部 1. ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTf ...

  4. 对RDD分区的理解

    举个例子: val logFile = "file:///home/soyo/桌面/6.txt" val conf = new SparkConf().setAppName(&qu ...

  5. ubuntu系统快捷键设置

    1.打开'系统设置' 2.点击键盘 3.选择快捷键,查看和修改对应的快捷键.

  6. 怎么在windows上安装 ansible How to install ansible to my python at Windows

    答案是不能再window上安装,答案如下: It's back! Take the 2018 Developer Survey today » Join Stack Overflow to learn ...

  7. [LeetCode]152. Maximum Product Subarray

    This a task that asks u to compute the maximum product from a continue subarray. However, you need t ...

  8. Java系列学习(一)-JDK下载与安装

    1.Java语言平台版本 J2SE:Java 2 Platform Standard Edition,java平台标准版 J2ME:Java 2 Platform Micro Edition,java ...

  9. css3 绘制书本

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  10. canves图形变换

    canves用得好可以有好多效果: html:<canvas id="myCanvas" width="700" height="300&quo ...