题目链接:http://codeforces.com/problemset/problem/373/B
题目意思:给出w,m和k,需要找出从m开始,可以有多少个连续的数(m+1,m+2,...)(在添加(m+i)这个数到序列时,需要付出s(m+i) * k的代价,i = 1,2,...)满足不超过总代价w的长度。
可以列一个这样的方程:
一位数的个数*1*k + 两位数的个数*2*k + 三位数的个数*2*k + ... + n位数的个数*n*k = w
化简后得到:
一位数的个数*1 + 两位数的个数*2 + 三位数的个数*2 + ... + n位数的个数*n = w / k
思路就是:得出m是一个几位数(假设为len)——> m要到达len+1位数时还需要多少个len位数 ——> 代价 w 更新。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 using namespace std; 5 6 int main() 7 { 8 __int64 w, m, k, i, res, tmp, num; 9 10 while (scanf("%I64d%I64d%I64d", &w, &m, &k) != EOF) 11 { 12 w /= k; 13 int len = 0; 14 // 判断m是几位数(len) 15 for (tmp = m; tmp; tmp /= 10) 16 len++; 17 // 赋予num最大的len位数(10,100,1000, ...) 18 num = 1; 19 for (i = 1; i <= len; i++) 20 num *= 10; 21 for (res = 0, i = len; ;i++) 22 { 23 if (w - (num-m) * i >= 0) // i位数里有多少个k 24 { 25 w -= i * (num-m); 26 res += num - m; 27 m = num; 28 num *= 10; 29 } 30 else // w 不足num-m 31 { 32 res += w/i; 33 break; 34 } 35 } 36 printf("%I64d ", res); 37 } 38 return 0; 39 }