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;
}
}