zoukankan      html  css  js  c++  java
  • codeforces A. Nuts 解题报告

    题目链接:http://codeforces.com/problemset/problem/402/A

    题目意思:几经辛苦,终于体明题目噶意思了 = =,完全是考验一个人是否清醒的最简便方法- -!

        给出4个数,分别为k,a,b和v。k:1个box最大可以分成的section;a:需要放置的nut的个数;b:divisor的数量  v:每个section的容量。有两个约束条件:(1)每个box的section数不能超过k个; (2)放置的nut的数量不能超过v个(即不能超过section的最大容量)。注意:x个divisor可以得到x + 1个section,每个section的容量为v个。

        我的做法有点麻烦。以 b 与 k - 1的关系得到两个部分: b >= k-1 和 b < k

        先讨论 b >= k-1 的情况。它表示可以利用divisor来划分出更多的section,最少为 k 个,box相应的最少为1个。b / (k-1) 表示有k个section的box数,从i = 1 ~ b/(k-1) 来扫描,每个box可以装的最多nut数为k * v,当然这个过程中有可能把所有的nut装完,也有可能k个section的box数用光都不能装满。对于后者的情况,求出未消耗完的divisor数(b -= b/(k-1)*(k-1))可以划分出的section数(b+1),然后加入去接下来用到的box(有b+1个section),能装(b+1)*v个nut,假设还没装得完,那么接下来用到的box,容量都为v。依次相加直到 >= a为止。

       至于 b < k-1 这种情况比较简单。它表示装得最多nut的box 数最大的section 都比 k 小。那么它能划分出的section数最大为 b+1,能装的nut数最多为 (b+1)*v,接下来如果未装满所有nut,就需要用到容量为v的box数。

        

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int k, a, b, v, i;
     9     while (scanf("%d%d%d%d", &k, &a, &b, &v) != EOF)
    10     {
    11         int sum = 0;
    12         int cnt = 0;
    13         if (b >= k-1)   // 情况一
    14         {
    15             int flag = 0;
    16             for (i = 1; i <= b/(k-1); i++)  // 有k个section的box数
    17             {
    18                  sum += k * v;   // 每个box的容量
    19                  cnt++;    // box数递增
    20                  if (sum >= a)   // 不需要用完所有含k个section的box
    21                  {
    22                      flag = 1;
    23                      break;
    24                  }
    25             }
    26             if (!flag)   // 用完k个section的所有box都不能装满
    27             {
    28                 b -= b/(k-1) * (k-1);  // divisor有剩
    29                 sum += (b+1) * v;      // 紧随着的box的section数为b+1,容量相应乘v
    30                 cnt++;
    31                 while (sum < a)   // 用完这个特殊的box都不能装完所有的nut
    32                 {
    33                     sum += v;     // 后面要用到的box容量都为v
    34                     cnt++;
    35                 }
    36             }
    37         }
    38         else         // 情况二
    39         {
    40             sum += (b + 1) * v;      // 第一个box的section为b+1
    41             cnt++;
    42             while (sum < a)   // 这个box装不完所有的nut
    43             {
    44                 sum += v;
    45                 cnt++;
    46             }
    47         }
    48         printf("%d
    ", cnt);
    49     }
    50 }
  • 相关阅读:
    MQTT研究之EMQ:【JAVA代码构建X509证书【续集】】
    MQTT研究之EMQ:【JAVA代码构建X509证书】
    MQTT研究之EMQ:【SSL证书链验证】
    自己DIY出来一个JSON结构化展示器
    Mac系统还原
    Mac初用
    工作中缓存使用方式的总结
    面试突击(八)——JVM的结构及内存模型,是怎么划分的?
    面试突击(七)——JVM如何加载Java字节码信息的?
    面试突击(六)——JVM如何实现JAVA代码一次编写到处运行的?
  • 原文地址:https://www.cnblogs.com/windysai/p/3607846.html
Copyright © 2011-2022 走看看