zoukankan      html  css  js  c++  java
  • 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
    ", res);
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    ceph 手工部署
    zstack 搭建部署
    ceph crush
    mini2440动态加载hello.ko模块
    j-flash配置用于烧录mini 2440 nor flash
    (转载)PPP协议规范
    at91sam9263: 定时器
    cyg_io_read返回值是0,因为读到的字节长度在参数中
    read函数
    Linux编译错误:‘cout’在此作用域中尚未声明
  • 原文地址:https://www.cnblogs.com/windysai/p/3474267.html
Copyright © 2011-2022 走看看