CF313A Ilya and Bank Account 题解
Update
- \(\texttt{2021.3.6}\) 经求学的企鹅提醒修改了 Content 部分的数据范围。
Content
有一个人的银行账户里有 \(n\) 元钱,他可以删去倒数第二位获最后一位数字来使得账户里面的钱最大。请求出他的银行账户余额的最大值。
数据范围:\(10\leqslant |n|\leqslant 10^9\)。
Solution
这道题目很简单,枚举倒数第二位和最后一位数字删去之后的账户余额,然后比较哪个更大就好。当然,如果是正数的话不需要删,肯定是越删余额越少的,毕竟谁都不希望把自己原来就有的钱变少。
具体我们用一个字符串实现,读入,如果第一个字符不是负号,那么就直接输出结束。否则,将负号以外的数一一枚举删除,然后比较答案更新。最后取最小值带负号输出,相当于最大值。不过这里要注意的一点就是,\(-0\) 是不合法的,所以,当答案是 \(0\) 时,我们不需要输出前面的负号。
Code
说明一下:
- \(\texttt{isdigit}\) 函数用来判断这个字符是否是数字。
- \(\texttt{(3f3f3f3f)}_{16}\) 表示的是十进制下的 \(1061109567\),可以通过这道题目的数据。注意取最小值初始化时一定要尽可能大!
- 中间那个注释的部分使我中间调试时用的。这对今后的竞赛中很有用,但注意正式提交代码时要把中间调试的部分注释掉!
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
char a[17];
int main() {
scanf("%s", a);
if(isdigit(a[0])) return printf("%s", a), 0;
else {
int len = strlen(a), ans = 0x3f3f3f3f;
for(int i = len - 2; i < len; ++i) {
int s = 0;
for(int j = 1; j < len; ++j)
if(j != i) s = s * 10 + a[j] - '0';
// printf("delete %d: %d\n", i, s);
ans = min(ans, s);
}
if(ans) printf("-");
return printf("%d", ans), 0;
}
}
本文作者:Eason_AC
本文链接:https://www.cnblogs.com/Eason-AC/p/15717079.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何反向绘制出 .NET程序 异步方法调用栈
· 领域驱动设计实战:聚合根设计与领域模型实现
· 突破Excel百万数据导出瓶颈:全链路优化实战指南
· 如何把ASP.NET Core WebApi打造成Mcp Server
· Linux系列:如何用perf跟踪.NET程序的mmap泄露
· C#开发的Panel滚动分页控件 - 开源研究系列文章
· 如何反向绘制出 .NET程序 异步方法调用栈
· ShadowSql之开源不易
· Java 原生异步编程与Spring 异步编程 详解
· 上周热点回顾(5.5-5.11)