清北学堂模拟赛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 ...
随机推荐
- POJ 1273 Drainage Ditches 最大流
这道题用dinic会超时 用E_K就没问题 注意输入数据有重边.POJ1273 dinic的复杂度为O(N*N*M)E_K的复杂度为O(N*M*M)对于这道题,复杂度是相同的. 然而dinic主要依靠 ...
- JSP-Runoob:JSP 指令
ylbtech-JSP-Runoob:JSP 指令 1.返回顶部 1. JSP 指令 JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言. 语法格式如下: <%@ direc ...
- Coursera Algorithms week3 快速排序 练习测验: Decimal dominants(寻找出现次数大于n/10的元素)
题目原文: Decimal dominants. Given an array with n keys, design an algorithm to find all values that occ ...
- E20170804-mk
epic n. 史诗; 叙事诗; 史诗般的作品; estimate vt. 估计,估算; 评价,评论; 估量,估价; Sprint vi. 冲刺,全速短跑; n. 全速短跑; 速度或活动的突然爆发; ...
- String Successor(模拟)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3490 题意:给出一个字符串,一个操作次数,每次操作从当前字符串最右边的字符 ...
- ckeditor详细设置
CKEditor 3 JavaScript API Documentation : http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.con ...
- BZOJ 3779 LCT 线段树 DFS序 坑
hhhh抄了半天lty代码最后T了 对拍也没事.. 药丸 mine #pragma GCC optimize("O3") //By SiriusRen #include < ...
- 解决eclipse用maven install打包报错问题:-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
1.添加M2_HOME的环境变量 2.Preference->Java->Installed JREs->Edit 选择一个jdk, 添加 -Dmaven.multiModuleP ...
- UNIX环境高级编程--5
标准I/O库流和FILE对象: 所有I/O函数都是围绕文件描述符的.当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的I/O操作.当用标准I/O库打开或者创建一个文件时,我们已 ...
- 使用NSSM将Kibana安装为Windows服务
Kibana不同于Elasticsearch,前者官方并没有提供安装为系统服务的方法,如果直接运行在生产环境中会尤为麻烦,一旦服务器因故重启就要手动开启,所以将Kibana安装为系统服务非常有必要. ...