专栏文章
题解:P13672 [GCPC 2023] German Conference for Public Counting
P13672题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miodppgl
- 此快照首次捕获于
- 2025/12/02 17:31 3 个月前
- 此快照最后确认于
- 2025/12/02 17:31 3 个月前
思路
当某个数包含相同的数字,此时需要多种这样的数字牌子。
例如:如果要表示出 ,那么必须要有至少 个数字 牌子。
例如:如果要表示出 ,那么必须要有至少 个数字 牌子。
也就是说,对于除了 之外的所有的数字 ,我们要找最大的 (共 个 )。
此时,需要至少 个 数字牌子来表示这个数 ,为答案贡献 。
此时,需要至少 个 数字牌子来表示这个数 ,为答案贡献 。
具体统计方法
可以首先求出最大的 ,设有 个 。
接下来,将这个数分别 ,得到 。
注:每个数都包含 个数字。
注:每个数都包含 个数字。
再分别将这些数从大到小与 比大小,如果小于等于 就结束比较。这样就可以找到最大的 以及其对应的 ,此处显然满足 。
找到这个 之后,可以发现:
- 的倒计时中包含 ( 个数字),所以它们一共需要 个数字牌。
- 的倒计时中也包含 ( 个数字),所以它们一共需要 个数字牌。
- 这个倒计时中还包含 ( 个 ),所以还额外需要 个数字牌。
最后求出答案:。
特判
如果 是一位数,即 ,我们的统计方法没有统计 ,应该加上。
为了避免麻烦,可以直接算出来:当 是一位数时,需要 个数字牌。
代码
CPP#include<bits/stdc++.h>
using namespace std;
// 求 b
int digit(int x){
int sum = 0;
while(x) x/=10, sum++;
return sum;
}
int main(){
int x; cin >> x;
int d = digit(x);
// 特殊处理
if(d == 1){
cout << x + 1;
return 0;
}
// 求最大的 11...1≤n
int base = 0;
for(int i=1; i<=d; i++)
base *= 10, base++;
// 直接相除得到对应的 a
int t = x / base;
// 答案 // b=c
int ans = t*d + (10-t)*(d-1);
cout << ans;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...