专栏文章
题解:CF2093B Expensive Number
CF2093B题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipk3xzw
- 此快照首次捕获于
- 2025/12/03 13:18 3 个月前
- 此快照最后确认于
- 2025/12/03 13:18 3 个月前
简要题意
定义一个数 的花费为 。对其进行若干次操作,每次操作删除其中一位数,求使其花费最小的最少操作数。最多删除 个数位且最后得到的数必须大于 。
思路
当只有一个非 数位,即 时,花费为 ,容易证得此为最小花费。因此对于所有数,最小花费一定为 。我们只需要在此基础上保留不影响该花费的数位,以最小化操作数。
我们选取最后一个非零数位 为分界点,对两边的数进行分类讨论:
- 当 时,若 不为 ,保留后花费必然增加,所以必须删除。在删除所有不为 的数后,所有前面的 变为前导零,并不会增加花费,不必删除。
- 当 时,所有数都是 ,每有一个 就会使分子变大,而分母不变,因此也必须删除。
综上,我们删除 前所有不为 的数位,删除 后所有的数位。
CPP#include <bits/stdc++.h>
using namespace std;
int t;
string s;
int main()
{
cin >>t;
while (t--)
{
cin >> s;
int cnt = 0, end = s.length() - 1;
for (int i = s.length() - 1; i >= 0; i--)
{
if (s[i] != '0') {end=i;break;}
}
for (int i = 0; i < s.length(); i++)
{
if (i==end) continue;
if (s[i] != '0' && i < end) cnt++;
if (s[i] == '0' && i > end) cnt++;
}
cout << cnt << endl;
}
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...