题目链接:
题目意思:给出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 #include2 #include 3 #include 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位数里有多少个k24 {25 w -= i * (num-m); 26 res += num - m;27 m = num;28 num *= 10;29 }30 else // w 不足num-m31 {32 res += w/i; 33 break;34 }35 }36 printf("%I64d\n", res);37 }38 return 0;39 }