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 }

 

转载于:https://www.cnblogs.com/windysai/p/3474267.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值