bzoj 1110 贪心 + 进制转换

思路:感觉脑洞好大啊。。。 因为每两个砝码其中一个都是另一个的倍数,我们可以知道砝码的种数很少,我们将所有容器的

容量都转换成用这些砝码的重量的进制表示,然后将所有砝码排序,然后贪心地取,取到不能再取。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int, int>

using namespace std;

const int N = 1e5 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 +7;

int n, m, w[N], a[N], b[N], cnt[50], tot;
int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &w[i]);
    }

    for(int i = 1; i <= m; i++) {
        scanf("%d", &a[i]);
        b[tot++] = a[i];
    }

    sort(b, b + tot);
    tot = unique(b, b + tot) - b;
    reverse(b, b + tot);

    for(int i = 1; i <= n; i++) {
        int now = w[i];
        for(int j = 0; j < tot && now; j++) {
            cnt[j] += now / b[j];
            now = now % b[j];
        }
    }

    int ans = 0;

    sort(a + 1, a + 1 + m);

    for(int i = 1; i <= m; i++) {
        for(int j = tot - 1; j >= 0; j--) {
            if(b[j] == a[i]) {
                if(cnt[j]) {
                    cnt[j]--;
                    ans++;
                    break;
                } else {
                    int pos = -1;
                    for(int k = j - 1; k >= 0; k--) {
                        if(cnt[k]) {
                            pos = k;
                            break;
                        }
                    }
                    if(pos == -1) {
                        i = m + 1;
                        break;
                    }
                    for(int k = pos + 1; k <= j; k++) {
                        cnt[k - 1]--;
                        cnt[k] += b[k - 1] / b[k];
                    }
                    ans++;
                    cnt[j]--;
                    break;
                }
            }
        }
    }

    printf("%d\n", ans);
    return 0;
}
/*
*/

原文地址:https://www.cnblogs.com/CJLHY/p/9193563.html

时间: 2024-10-29 04:01:43

bzoj 1110 贪心 + 进制转换的相关文章

C#——进制转换!

进制转换 No.1 其他进制转十进制——按权展开相加法   即: 由于101.11(10),可写成1X102+0X101+1X100+1X10-1+1X10-2,即(以10为底的乘幂展开式)称按权展开式, 其中:101.11称为“数码” 数制中的(10)称为“基数” 数码中每个位数所具有的值称为“权” 那么其他进制也可写成按权展开式 如:对数字“101.11”的不同进制记数方式为~ 十进制表示为:  101.11(10) 二进制表示为:  101.11(2) 八进制表示为:  101.11 (8

进制转换内容总结

今天接触了进制转换的内容,即十进制,二进制,八进制,十六进制之间的相互转换. 一.基础内容 十进制:有十个基数 0,1,2,3,4,5,6,7,8,9 二进制:逢二进一,借一为二. 基数为0,1 八进制:逢八进一,借一为八. 基数为0,1,2,3,4,5,6,7 十六进制:逢十六进一,借一为十六. 基数为0,1,2,3,4,5,6,7,8,9,A(10),B(11),C(12),D(13),E(14),F(15) 二.转换方法 1.十进制与其他进制(二.八.十六) 十进制→ 二进制:十进制数除以

【基础】进制转换

1.什么是二进制.八进制.十进制. 十六进制? 我们平常生活中常用的是10进制,就是逢10进1: 二进制:逢二进一                由0.1组成: 八进制:逢八进一                由0-7组成:                                      前面以o开头的数字表示八进制                    在c语言中用%o  十进制:逢十进一                由0-9组成:                        

delphi 进制转换

----二进制到16进制 function BinaryToHex(strBinary: string): string;var  vD: Byte;  i: integer;  vHextStr: String;  vP: PChar;  vLen: integer;begin  vLen := length(strBinary);  if vLen mod 4 > 0 then  begin    SetLength(vHextStr, vLen div 4 + 1);    vLen :=

课程小结-C#进制转换

C#的进制转换 1.二进制转十进制 按权展开相加法 a*2^(n-1)+...+b*2^(2)+c*2^(1)+d*2^(0)+e*2^(-1)+...+f*2(-n) 例子: 二进制1011001.11(2)转换为十进制 1*2^6+0*2^5+1*2^4+1*2^3+0*2^2+0*2^1+1*2^0+1*2^-1+1*2^-2 =64+16+8+1+0.5+0.25 =89.75 八进制.十六进制转十进制同二进制转十进制. 2.十进制转二进制 分整数部分转换与小数部分转换 (1)整数部分转

2014年10月8日——进制转换

一.进制说明 1.十进制     十进制使用十个数字(0.1.2.3.4.5.6.7.8.9)记数,基数为10,逢十进一.     历史上第一台电子数字计算机ENIAC是一台十进制机器,其数字以十进制表示,并以十进制形式运算.设计十进制机器比设计二进制机器复杂得多.而自然界具有两种稳定状态的组件普遍存在,如开关的开和关,电路的通和断,电压的高和低等,非常适合表示计算机中的数.设计过程简单,可靠性高.因此,现在改为二进制计算机. 2.二进制 二进制以2为基数,只用0和1两个数字表示数,逢2进一.

补习中-进制转换

最近忽然起兴,在看一些程序,但是一堆16进制代码看的我脑袋晕头转向.. 没办法,底子太薄,开始补习吧! 先说10进制转换成2进制 比如42想转换成2进制,那就把42一直拿2往下除,除到商为0 42/2 = 21余0 21/2 = 10余1 10/2 =  5余0 5/2 =  2余1 2/2 =  1余0 1/0 =  0余1 从下往上写为 00101010 1前面那两个0是补位的..没什么用途. 想转成10进制也很简单, ^ 这个是幂的符号吧= =.  数学好长时间没学,早忘光了... 幕的个

数据概述与进制转换

什么是数据 数据是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材. 数据是信息的表现形式和载体,信息是数据的内涵.数据本身没有意义,数据只有对实体行为产生影响时才成为信息. 计算机中的数据按照表现形式可分为两类: 数字数据:由阿拉伯数字符号构成的数据.如各种统计或量测数据 模拟数据:在某个区间内产生的连续值,如视频.图像.声音等 在计算机系统中,数据以二进制信息单元0.1的形式表示. 进制及进制转换 1.计算机采用二进制的主要原因 技术实现简单 简化运算规则 适

进制转换转换以及原码反码和补码

一.进制转换 1.数制和码制 常用数制表示法 十进制 二进制 八进制 十六进制 8421BCD码 0 0 0 0 0000 1 1 1 1 0001 2 10 2 2 0010 3 11 3 3 0011 4 100 4 4 0100 5 101 5 5 0101 6 110 6 6 0110 7 111 7 7 0111 8 1000 10 8 1000 9 1001 11 9 1001 10 1010 12 A 0001 0000 11 1011 13 B 0001 0001 12 1100