精华内容
下载资源
问答
  • 输入的n代表敌人数,for循环是为了枚举所有的情况 比如输入n=5 当i=3时,转化为二进制为00011 代表第一个和第二个敌人已经被杀了 第三个第四个第五个还没杀死 实际上二进制枚举的范围是00000~11111 ③ if(i&(1)) ...

    Description

    At 184~280 A.D ,there were many kingdoms in China. Three strongest among them are “Wei”, “Shu”, “Wu”. People call this period as “Three Kingdoms”.
    HH is a super “Three Kingdoms” fan, because at this period there were many heroes and exciting stories. Among the heroes HH worships LvBu most.
    LvBu is the God of War and is also intelligent, but his ambition is too big while enemies are too powerful .Many monarchs wanted to kill him.
    At 198 A.D ,CaoCao fought with LvBu at Xuzhou.Though Lvbu is the God of War ,CaoCao had so many generals: Xuchu,DianWei XiahouChun……Facing so many heroes ,could LvBu beat all of them?
    在这里插入图片描述
    Given the LvBu’s ATI, DEF, HP, and enemies’ ATI, DEF,HP, experience (if LvBu killed one of his enemies, he can get that experience ,and if his experience got more than or equal to 100*level,he would level-up and become stronger) and the In_ATI,In_DEF,In_HP(indicating when LvBu levels up,his ability will increase this point).
    Each turn LvBu will choose an enemy to fight. Please help LvBu find a way to beat all of enemies and survive with the max HP.
    Here’s a fight between LvBu and A:
    If LvBu attack A, A will lose Max(1,LvBu’s ATI- A’s DEF) hp;
    If A survived, he will give LvBu Max(1,A’ATI- LvBu’DEF) injury.
    If LvBu is still alive, repeat it untill someone is dead(hp <= 0).
    LvBu’s initial level is 1 and experience is 0,and he can level up many times.

    Input

    The input contains at most 20 test cases.
    For each case , the first line contains six intergers ,indicating LvBu’s ATI,DEF,HP and In_ATI,In_DEF,In_HP.
    The next line gives an interger N(0<N<=20),indicating the number of the enemies .
    Then N lines followed, every line contains the name(the length of each name is no more than 20),ATI,DEF,HP, experience(1<experience<=100).

    Output

    If LvBu is dead output “Poor LvBu,his period was gone.”
    Or output the maximum HP left.

    Sample Input

    100 80 100 5 5 5
    2
    ZhangFei 95 75 100 100
    XuChu 90 90 100 90

    100 75 100 5 5 5
    1
    GuanYu 95 85 100 100

    Sample Output

    30

    Poor LvBu,his period was gone.

    分析


    题意:
    给出战神吕布的初始攻击力ATI、防御力DEF、生命值HP、每升一级增加的攻击力In_ATI,增加的防御力In_DEF和增加的生命值In_HP。然后给出n个敌人的攻击力、防御力、生命值和杀死该单位能获得的经验值EXP。

    吕布的初始经验值EXP是0,初始等级level是1,每当EXP>=level*100时就会升级。

    在吕布LvBu和敌人A之间的战斗有3条规则

     1.吕布攻击A,A失去 Max(1,LvBu’s ATI- A’s DEF) HP

     2.A攻击吕布,吕布失去Max(1,A’ATI- LvBu’DEF)HP

      3.战斗持续到任意一方死亡

    如果吕布能够将全部敌人杀死,并且自己不死,那么输出能够余下的最大HP,否则输出"Poor LvBu,his period was gone."


    看完了题意,应该是对本题有了清晰的思路了,现在我来介绍一下状态压缩到底是啥

    状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴。

    为了更好的理解状压dp,需要了解位运算相关的知识。

    1.’ & ’符号,x&y,会将两个十进制数在二进制下进行与运算,然后返回其十进制下的值。例如3(11)&2(10)=2(10)。

    2.’ | ’符号,x|y,会将两个十进制数在二进制下进行或运算,然后返回其十进制下的值。例如3(11)|2(10)=3(11)。

    3.’ ^ ’符号,x ^ y,会将两个十进制数在二进制下进行异或运算,然后返回其十进制下的值。例如3(11)^2(10)=1(01)。

    4.’ << ’符号,左移操作,x<<2,将x在二进制下的每一位向左移动两位,最右边用0填充,x<<2相当于让x乘以4。相应的,’>>’是右移操作,x>>1相当于给x/2,去掉x二进制下的最有一位。
    在这里插入图片描述
    这四种运算在状压dp中有着广泛的应用,常见的应用如下:

    1.判断一个数字x二进制下第i位是不是等于1。

    方法:if ( ( ( 1 << ( i - 1 ) ) & x ) > 0)

    将1左移i-1位,相当于制造了一个只有第i位上是1,其他位上都是0的二进制数。然后与x做与运算,如果结果>0,说明x第i位上是1,反之则是0。

    2.将一个数字x二进制下第i位更改成1。

    方法:x = x | ( 1<<(i-1) )

    证明方法与1类似,此处不再重复证明。

    3.把一个数字二进制下最靠右的第一个1去掉。

    方法:x=x&(x-1)

    看完上面关于状态压缩的知识,是不是又学到了一点东西?接着,我将结合代码对此题进行分析

    ①首先,题目告诉了我们最多有20个敌人,那么我们dp数组应该开多大?
    显然1<<20 学过上面知识后,把它转化成二进制的话就是1后面20个0 这20个人代表最多的20个敌人 我们用二进制下的0表示没杀死这个敌人 1代表杀死了这个敌人

    ②for(int i=0;i<(1<<n);i++) 这段代码什么意思?
    输入的n代表敌人数,for循环是为了枚举所有的情况 比如输入n=5 当i=3时,转化为二进制为00011 代表第一个和第二个敌人已经被杀了 第三个第四个第五个还没杀死 实际上二进制枚举的范围是00000~11111

    ③ if(i&(1<<j)) 这段代码代表什么意思?
    学习完上面知识后,我们知道了&操作就是判断 i 的二进制下的第j位是否1 实际上就是判断第j个敌人是否被杀死

    ④if(dp[(1<<n)-1])这段代码代表什么意思?
    1<<n代表的二进制下1左移n位,向右补0 假设n=3 就是1000 二进制减1 则为0111 就是判断最后杀死了所有敌人后所剩的HP是否还大于0 如果小于0 GG

    题目一些坑点

    ①杀死敌人所获得的经验总和/100=我们可以升的等级 但是起始等级为1 我们最后还要加1

    ②杀死敌人的话,我们可以算出一共要砍几刀,假设吕布需要砍 t 刀敌人才会死,那么吕布扣的血不是 t 次而是 t - 1 次,因为最后一次已经被砍死了

    ③关于升级其实就是100经验升级一次,题目意思是总的经验EXP超过当前等级的100倍 就是每100经验升级


    AC
    在这里插入图片描述

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define mst(a,b) memset(a,b,sizeof(a))
    using namespace std;
    int dp[1<<20]; //dp数组 代表在某一状态下的最大HP
    const int maxn=20+5;
    int A[maxn],D[maxn],H[maxn],E[maxn];
    char temp[maxn];
    int ATI,DEF,HP,IN_ATI,IN_DEF,IN_HP;
    int main()
    {
    	//注意,此题最好用scanf和printf 用cin和cout就算用了加速代码时间上大约多了10倍。。。
        while(~scanf("%d%d%d%d%d%d",&ATI,&DEF,&HP,&IN_ATI,&IN_DEF,&IN_HP))
        {
            int n;
            scanf("%d",&n);
            for(int i=0;i<n;i++)
                scanf("%s%d%d%d%d",temp,&A[i],&D[i],&H[i],&E[i]);
            mst(dp,0);
            dp[0]=HP;
            for(int i=0;i<(1<<n);i++){  //枚举所有情况 例n=4 从0000~1111
                if(dp[i]<=0)   //当前HP小于0 不用后续操作了
                    continue;
                int exp=0;
                for(int j=0;j<n;j++) 
                    if(i&(1<<j))   //判断第j位敌人是否杀死
                    exp+=E[j];
                int leveup=exp/100;  //算出杀的敌人够我们升多少级
                int ati=ATI+leveup*IN_ATI;
                int def=DEF+leveup*IN_DEF;
                int curleveup=leveup+1;  //加上起始等级1 
                for(int j=0;j<n;j++){
                    if(i&(1<<j))   //尝试去杀其他人 但是我们要确保第j位没有杀死过
                        continue;
                    int inj=max(1,ati-D[j]);
                    int t=H[j]/inj;  //算出吕布和敌人一共打了几次
                    if(H[j]%inj)
                        ++t;
                    int dd=(t-1)*max(1,A[j]-def);  //t-1是因为最后一次杀死了 所以吕布不会扣血
                    if(dd>=dp[i])
                        continue;
                    int curdp=dp[i]-dd;
                    if(exp+E[j]>=curleveup*100)  //判断是否能够升级
                        curdp+=IN_HP;
                    int ans=i+(1<<j);
                    dp[ans]=max(dp[ans],curdp); //更新最大的HP
                }
            }
            if(dp[(1<<n)-1])  //杀完所有敌人后HP大于0
                printf("%d\n",dp[(1<<n)-1]);
            else
                printf("Poor LvBu,his period was gone.\n");
        }
        return 0;
    }
    

    学如逆水行舟,不进则退

    展开全文
  • 有些时候,我们需要画图后的二进制数据流,matplotlib没有提供相关的api,通过源码查看与百度,得到下面此方法import matplotlib.pyplot as pltimport numpy as npimport iox=np.arange(10)y=x#plt.plot(x,y)#canvas...

    有些时候,我们需要画图后的二进制数据流,matplotlib没有提供相关的api,通过源码查看与百度,得到下面此方法

    import matplotlib.pyplot as plt

    import numpy as np

    import io

    x=np.arange(10)

    y=x

    #plt.plot(x,y)

    #canvas = plt.get_current_fig_manager().canvas

    #canvas.draw()

    fig=plt.figure()

    plt.plot(x,y)

    canvas=fig.canvas

    #上面这段代码和上面注释掉的代码效果一样

    #方法1

    buffer = io.BytesIO()

    canvas.print_png(buffer)

    data=buffer.getvalue()

    buffer.close()

    #方法2

    buf, size = canvas.print_to_buffer()

    image = Image.frombuffer('RGBA', size, buf, 'raw', 'RGBA', 0, 1)

    buffer=io.BytesIO()

    image.save(buffer,'PNG')

    data=buffer.getvalue()

    buffer.close()

    with open('hhh.png',mode='wb') as f:

    f.write(data)

    #f=open('hh.png',mode='wb')

    #f.write(data)

    #f.close()

    如果我们想把二进制的图片转成数组也是可以的,

    buffer=io.BytesIO()

    buffer.write(data)

    img=Image.open(buffer)

    img = np.asarray(img)

    以上这篇matplotlib.pyplot画图 图片的二进制流的获取方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    展开全文
  • 基于GTK的画图软件-输出到二进制文件中,基于GTK的画图软件-输出到二进制文件中
  • matplotlib画图二进制数据流, 与 图片二进制 转图片的数组形式

    有些时候,我们需要画图后的二进制数据流,matplotlib没有提供相关的api,通过源码查看与百度,得到下面此方法

        import matplotlib.pyplot as plt
        import numpy as np
        import io
        x=np.arange(10)
        y=x
        #plt.plot(x,y)
        #canvas = plt.get_current_fig_manager().canvas
        #canvas.draw()
        fig=plt.figure()
        plt.plot(x,y)
        canvas=fig.canvas
        #上面这段代码和上面注释掉的代码效果一样
    
        #方法1
        buffer = io.BytesIO()
        canvas.print_png(buffer)
        data=buffer.getvalue()
        buffer.close()
        #方法2
        buf, size = canvas.print_to_buffer()
        image = Image.frombuffer('RGBA', size, buf, 'raw', 'RGBA', 0, 1)
        buffer=io.BytesIO()
        image.save(buffer,'PNG')
        data=buffer.getvalue()
        buffer.close()
    
    
        with open('hhh.png',mode='wb') as f:
            f.write(data)
        #f=open('hh.png',mode='wb')
        #f.write(data)
        #f.close()
    

    如果我们想把二进制的图片转成数组也是可以的,

    buffer=io.BytesIO()
    buffer.write(data)
    img=Image.open(buffer)
    img = np.asarray(img)
    展开全文
  • 今天小编就为大家分享一篇matplotlib.pyplot画图 图片的二进制流的获取方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 目标:目标文件为一个float32型存储的二进制文件,按列优先方式存储。本文使用Python读取该二进制文件并使用matplotlib.pyplot相关工具画出图像工具:Python3, matplotlib,os,struct,numpy1. 读取二进制文件首先...

    目标:目标文件为一个float32型存储的二进制文件,按列优先方式存储。本文使用Python读取该二进制文件并使用matplotlib.pyplot相关工具画出图像

    工具:Python3, matplotlib,os,struct,numpy

    1. 读取二进制文件

    首先使用open函数打开文件,打开模式选择二进制读取"rb"。

    f = open(filename, "rb")

    第二步,需要打开按照行列读取文件,由于是纯二进制文件,内部不含邮任何的数据结构信息,因此我们需要给定二进制数据的行数列数(nx和ny)来确定图像的形状。这里我们的数据类型是float32型的,对应过来是4bytes,使用for循环逐个read4个字节。

    for i in range(nx):

    for j in range(ny):

    data = f.read(4)

    得到的结果如下:

    b'5x9dx82xc3'

    b'xb1x04x10xc4'

    b'xc1x9eDxc4'

    b'ax86Rxc4'

    b'x15x01=xc4'

    可以看到,读入的数据为十六进制数,这个时候的数据并不能直接用来画图,需要转换为float32型。这里使用struct.unpack来转译

    data_float = struct.unpack("f", data)[0]

    就可以得到正确的结果了

    -261.2281799316406

    -576.0733032226562

    -786.4805297851562

    -842.0996704101562

    -756.0169067382812

    建立一个numpy数组,将读入的数据分别按列优先的方式放入数组,就完成了图像读入的操作。

    将上述操作包装成函数,代码如下:

    def xshow(filename, nx, nz):

    f = open(filename, "rb")

    pic = np.zeros((nx, nz))

    for i in range(nx):

    for j in range(nz):

    data = f.read(4)

    elem = struct.unpack("f", data)[0]

    pic[i][j] = elem

    f.close()

    return pic

    2. 画出图像

    这里我们的目的是将矩阵输出灰度图,并保存为tiff格式的图像,效果图如下(该图为使用弹性波波动方程在Marmousi模型下的波场快照):

    9916ce27c53669c1c123ac91184763c7.png

    不需要坐标轴的信息,直接使用imsave命令,使用cmap选定颜色格式即可。

    plt.imsave('output.tiff', img, format='tiff', cmap=plt.cm.gray)

    如果使用PIL库读取图像,可能会得到不同的效果,可能需要做直方图均衡,目前还没有找到原因。

    901db039e795d8278f9eab2a5dbed7a8.png

    以上这篇使用Python读取二进制文件的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    展开全文
  • 视频版【“二货”计算机闲话二进制】老狮:你知道数字的由来吗?小奇:不知道,老狮,您讲讲呗(心里想:很奇怪啊,从小到大都在学数学,但老师好像从没讲过数字是怎么来的?)老狮:数字最初起源于对事物的计数,例如...
  • 将十进制转换为二进制用的思想是 除2取余法 我画图来表示: 23对应的二进制是 10111,即将余数按箭头方向排列出来的值。定义一个 i 变量,每除 2 一次,i++,对应的余数乘 10^(i-1),到商为0时,循环结束,将...
  • 十进制转化成二进制(C++)

    千次阅读 2019-07-22 14:50:31
    十进制转化为二进制的方法,在数学上是除二取余法,如下图(自己在画图上画的,有点子丑,,,): 我这是以36为例,用36不断的去除二取余,左边就是余数,最后从下至上把余数连起来,就是我们要得到的结果,就是...
  • )老狮:数字最初起源于对事物的计数,例如古人打猎捉了6只兔子,为了记住自己狩猎的成绩,用画图表示为:时间长了,这个人会想:为什么我非得这么麻烦的画6只兔子?为什么我不画一只兔子再用划线表达6只兔子呢?然后...
  • JAVA之读取二进制文件

    万次阅读 2018-10-26 22:56:03
    目的在于:将一个二进制文件中的数据读取出来,其中数据包括点的位置信息和压力值及状态。将这些数据画作图像的形式展示。 本小程序分为以下几部分: (1)读取二进制文件;其中需要考虑二进制文件读出来的是十...
  • C语言实现信号打包成二进制文件并在Matlab中读取并画图(VS版)前些天老师布置了一道作业:在main.cpp里面生成了两个信号s1和s2,将这两个信号的数据用二进制形式写道文件signal.dat里面,然后用Matlab从该文件中读取...
  • clear,clcnt=735;ny=73;%2.5*2.5格点的nx=144;%2.5*2.5格点的f=netcdf('air.mon.mean.nc','nowrite');tt=f{'air'}(:);close(f)fid=fopen('a5.grd','w');for it=1:ntfor j=1:nyfor i=1:nxc...
  • # 读取数据 bin 文件 import pandas as pd import numpy as np import os import matplotlib.pyplot as plt import struct def read_data(): file_dir = './' file_name = 'Raw Data-1-1Y520230404-10-14-03_8192...
  • 其中负数用补码表示由于在计算机中的运算,都要转变为二进制数,所以我们在写这道题的时候,没有必要将其转换为二进制数(~ ̄▽ ̄)~二进制数中 n和n-1的二进制数 取与 会有一个规律,下面会画图推出规律的。...
  • 如图,打开画图工具->点击重新调整大小->选择像素->分别输入1 记得把保持纵横比去掉,不然为等比例修改。 字节分析 bmp文件头(14位) 位图信息头 多余的0? 经过比较发现,还有4个字节数据, 前面3个...
  • 这里一个技巧是利用numpy自带的save和load方法,就可以把numpy数组写入到二进制文件中,之后直接调用load进行处理,不用自己写循环输出成txt在处理。 # 计算chi0 time_start=time.time() print("Start ...
  • 进制问题

    2019-07-11 11:57:59
    二进制 作用:电子设备认识 组成:0和1 特点:逢二进一 十进制向二进制转换(了解) 1)通过计算器实现 2)通过JAVA提供的API来实现 3)通过画图来转换(掌握) 二进制向十进制换算(了解) 1101 —> 13 1 1 0 1 12^3 + ...
  • 在我给出的链接中的博客介绍了两种“求一个整数中二进制数1的个数”的两种方法,第一种方法没有解释,因此我在这里给出我自己的理解,以及比较。 下面是原文章的两种思路截图: 思路 思路一(画图举例子) ...
  • 【题目】使用matplotlib.pyplot所画图片的二进制流获取方法以及如何将它转换为图片array(附代码) 概述 在python中,可以通过matplotlib.pyplot进行画图并可以使用plt.savefig(save_path, dpi= ])进行保存,但是要...
  • 1:获取报表运算后的结果集,客户根据获取的结果集用自己的方法画图 2:通过自定义统计图方式,利用统计图属性面板中的定义的分类轴,系列,运算后将数据保存成xml或者其它对象中。 3:获取后台生成的统计图,再通过...
  • * A:十进制到任意进制的转换原理 ... * 十进制--二进制 60转化为二进制 (60除以2---倒取余 为111100)  * 十进制--八进制 (60除以8---倒取余 为74)  * 十进制--十六进制 (60除以16---倒取余 为3C,60/1...
  • 目的 给一个二维数组(8列为1行的),通过阈值,...% dir为二进制2十六进制大小端 % quan_x,quan_y分别为x轴圈数,以及y轴合成数据个数 % n为第n幅图像 %绘图完成 下面单独转换数据 subplot(n); hold on [x,y]=size
  • 利用python在excel中画图一、前言1.1、实现效果1.2、需要用到的库的安装、代码分开讲解2.1、对象的定义以及初始化2.2、对象的方法1:行高列宽调整,以防止图像变形2.3、对象的方法2:10进制转化为16进制2.4、对象...
  • 平常使用GMT画图,如果需要用到栅格数据的话,则需要用“.grd”的数据,早前都是使用matlab将二进制的数据转换成xyz的三列的文本,再用gmt 内置的 xyz2grd进行转换,这样的转换不仅效率低,而且极其占用硬盘空间。...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 198
精华内容 79
关键字:

二进制画图