清北学堂模拟赛d2t2 位运算2(bit)
题目描述
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)的更多相关文章
- 清北学堂模拟赛d1t1 位运算1(bit)
题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ...
- 清北学堂模拟赛d1t6 或和异或(xor)
题目描述 LYK最近在研究位运算,它研究的主要有两个:or和xor.(C语言中对于|和^) 为了更好的了解这两个运算符,LYK找来了一个2^n长度的数组.它第一次先对所有相邻两个数执行or操作,得到一 ...
- 清北学堂模拟赛d6t4 数组异或
分析:直接O(n^3)做是只有50分的,可以加一点小小的优化,就是c[k]可以从c[k-1]得到,但是还是只有60分,从宏观意义上是不能继续优化了.对于这类涉及到位运算的性质的题目,将每个数转化成二进 ...
- 清北学堂模拟赛d4t1 a
分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...
- 清北学堂模拟赛day7 数字碰撞
/* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...
- 清北学堂模拟赛d6t6 棋盘迷宫
3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...
- 清北学堂模拟赛d1t2 火柴棒 (stick)
题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ...
- 清北学堂模拟赛d2t6 分糖果(candy)
题目描述总共有n颗糖果,有3个小朋友分别叫做L,Y,K.每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感.也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果 ...
- 清北学堂模拟赛d1t4 一道图论好题(graph)
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,不仅有边权还有点权. LYK给出了一个子图的定义,一张图G’={V’,E’}被称作G的子图,当且仅当 ·G ...
随机推荐
- Mariadb-lib
mariadb-libs-5.5.44-2.el7.centos.x86_64
- @RequestParam 和 @RequestBody 接受的时间格式
这两个接受的时间格式不相同 首先看一下他们的区别 @RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容.(Ht ...
- JavaScript--innerHTML 属性
innerHTML 属性用于获取或替换 HTML 元素的内容. 语法: Object.innerHTML 注意: 1.Object是获取的元素对象,如通过document.getElementById ...
- HTML--使用提交按钮,提交数据
在表单中有两种按钮可以使用,分别为:提交按钮.重置.这一小节讲解提交按钮:当用户需要提交表单信息到服务器时,需要用到提交按钮. 语法: <input type="submit" ...
- hbuilder中的 http://www.w3.org/TR/html4/loose.dtd
<!-- This is the HTML 4.01 Transitional DTD, which includes presentation attributes and elements ...
- [ 51Nod 1327 ] 棋盘游戏
\(\\\) \(Description\) 给出一张\(N\times M\)的棋盘,每个格子最多放置一个棋子,一个合法的放置方案需满足: 每列至多放置一个棋子 对于第\(i\)行,前\(L_i\) ...
- iOS CoreData 开发
新年新气象,曾经的妹子结婚了,而光棍的我决定书写博客~ 废话结束. 本人不爱使用第三方的东东,喜欢原汁原味的官方版本,本次带来CoreData数据存储篇~ 创建应用
- React Native导航器Navigator
React Native导航器Navigator 使用导航器可以让你在应用的不同场景(页面)间进行切换.导航器通过路由对象来分辨不同的场景.利用renderScene方法,导航栏可以根据指定的路由来渲 ...
- Android项目实战_手机安全卫士流量统计
## 1.抽屉控件SlidingDrawer:一定要配置android:handle(把手)和android:content(内容),并在子View中添加把手和内容的布局```java <Sli ...
- Ajax——跨域访问
同源 基本概念:同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同. //同一域名下,允许通讯 http://www.a.com/a.js http://www.a.com/b.j ...