codeforces B. Making Sequences is Fun 解题报告

题目链接: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\n", res);
37     }
38     return 0;
39 }

 

posted @ 2013-12-14 13:35  windysai  阅读(302)  评论(0编辑  收藏  举报