zoukankan      html  css  js  c++  java
  • Painter

    时间限制:5000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    杂货店出售一种由N(3<=N<=12)种不同颜色的颜料,每种一瓶(50ML),组成的颜料套装。

    你现在需要使用这N种颜料;不但如此,你还需要一定数量的灰色颜料。

    杂货店从来不出售灰色颜料——也就是它不属于这N种之一。幸运的是,灰色颜料是比较好配置的,如果你取出三种不同颜色的颜料各x ml,混合起来就可以得到xml的灰色颜料(注意不是3x)。

    现在,你知道每种颜料各需要多少ml。你决定买尽可能少的“颜料套装”,来满足你需要的这N+1种颜料。

    那么你最少需要买多少个套装呢?

    输入

    输入包含若干组测试数据。每组数据一行:第一个数N, 3<=N<=12, 含义如上;

    接下来N+1个数,分别表示你需要的N+1种颜料的毫升数。最后一种是灰色。所有输入的毫升数<=1000.

    当某一行为0时代表输入终止

    注意:输入中不存在每个颜料套装的毫升数。由题意可知,每种各50ml,即一共50N ml

    输出

    每组数据输出一行,最少需要的套装数。

    样例输入
    3 40 95 21 0
    7 25 60 400 250 0 60 0 500
    4 90 95 75 95 10
    5 0 0 0 0 0 333
    0
    样例输出
    2
    8
    2
    4
    这题的难点在于已知各种颜料剩余量,求能够合成的灰色颜料的重量,想了好久,终于得出如下结论
    #include "bits/stdc++.h"
    using namespace std;
    const int INF = 0x3f3f3f3f;
    int arr[15];
    int n, gray, ans, rest;
    bool cmp(int n, int m) {
        return n > m;
    }
    int getGray(int m) {
        int ans = INF;
        // 第一种情况是所以多余出来的颜料的总量除3
        // 按n = 4举例 3 4 5 6 能合除 6ml 的灰色颜料 
        ans = min(ans, (rest + m * n * 50) / 3);
        // 第二种情况是剩余量最多的那种颜料合完灰色还有多余 
        // 按n = 4举例 3 4 5 100 能合除 6ml 的灰色颜料
        ans = min(ans, (rest - arr[0] + m * (n - 1) * 50) / 2);
        // 第三种情况是剩余量最多的两种颜料合完灰色还有多余 
        // 按n = 4举例 3 4 100 100 能合出 7ml 的灰色颜料
        ans = min(ans, rest - arr[0] - arr[1] + m * (n - 2) * 50);
        return ans;
    }
    int main() {
        while (scanf("%d", &n) && n) {
            int mx = 0;
            for (int i = 0; i < n; i++) {
                scanf("%d", &arr[i]);
                // 找到需求最多的颜料的重量 
                mx = max(mx, arr[i]);
            }
            scanf("%d", &gray);
            // 不考虑灰色要买的套装数量 
            ans = mx % 50 ? mx / 50 + 1 : mx / 50; 
            rest = 0;
            for (int i = 0; i < n; i++) {
                // 记录第i种颜料多余出来的重量 
                arr[i] = ans * 50 - arr[i];
                // 记录多余出来的颜料的总重量 
                rest += arr[i];
            }
            // 按多余出来的重量降序排序 
            sort(arr, arr + n, cmp);
            // i是考虑灰色还需要再购买的套装数 
            for (int i = 0; ; i++) {
                if (getGray(i) >= gray) {
                    printf("%d
    ", ans + i);
                    break;
                }
            }
        }
        return 0;
    } 

    感觉像是ZOJ3778的一个加强版

  • 相关阅读:
    CUBA 使用 Spring 查询接口
    Java中的数据验证
    CUBA China 最新进展
    遇见CUBA CLI
    CUBA-Platform将全面助力中国开发者
    ES6 延展操作符
    ES6 解构赋值
    Service Worker
    dom元素上添加断点(使用dom breakpoint找到修改属性的javascript代码)
    svg foreignObject的作用(文本换行,生成图片)
  • 原文地址:https://www.cnblogs.com/Angel-Demon/p/10343940.html
Copyright © 2011-2022 走看看