杭电 HOJ 2677 Dota all stars 解题报告

    题目本身不难。存储一下每个武器的合成方式,递归求和即可。关键在于它简单,而且写代码又挺复杂。。。一直想在网上找代码A过去的,因为这是我ACM Step 4.3最后一题,可是一直找不到,还是得自己打代码。不过现在大家可以直接Copy我的代码A过去了

#include <iostream>

#include <string>

using namespace std;



int n,sum;



class dynamicArray

{

private:

    int num;

public:

    dynamicArray *next;

    //    构造函数

    dynamicArray():num(0),next(0)

    {

    }

    dynamicArray(int n):num(n),next(0)

    {

    }

    //    添加数字

    void addNum(int n)

    {

        dynamicArray *p=this;

        while(p->next)

            p=p->next;

        p->next=new dynamicArray(n);

    }

    //    获取数字

    int getNum()

    {

        return num;

    }

    //    获取Next地址

    dynamicArray* getNext()

    {

        return next;

    }

    //    清空

    void clean()

    {

        dynamicArray *p=this;

        if(p->next)

        {

            p->next->clean();

            delete p->next;

            p->next=0;

        }

    }

};



struct sword

{

    string name;

    int value;

    int num;

    dynamicArray a;

} s[100];



int find(string &str)

{

    int i;

    for(i=0;i<n;i++)

        if(s[i].name==str)

            return i;

    return -1;

}



void getValue(int t,int num)

{

    dynamicArray *p;

    if(s[t].num>=num)

        s[t].num-=num;

    else

    {

        num-=s[t].num;

        s[t].num=0;

        if(s[t].value==0)

        {

            p=s[t].a.next;

            while(p)

            {

                getValue(p->getNum(),num);

                p=p->next;

            }

        }

        else

            sum+=s[t].value*num;

    }

}



int main()

{

    char ch;

    string str;

    int m,i,j,t,num;

    dynamicArray a,*p;

    while(cin>>n)

    {

        sum=0;

        memset(s,0,sizeof(s));

        for(i=0;i<n;i++)

        {

            cin>>s[i].name;

            cin>>s[i].value;

        }

        cin>>m;

        for(i=0;i<m;i++)

        {

            cin>>str>>num;

            if((t=find(str))==-1)

            {

                s[n].name=str;

                s[n++].num=num;

            }

            else

            {

                s[t].num=num;

            }

        }

        cin>>m;

        for(i=0;i<m;i++)

        {

            a.clean();

            while(cin>>str>>ch)

            {

                a.addNum(find(str));

                if(ch=='=')

                {

                    cin>>str;

                    if((t=find(str))==-1)

                    {

                        s[n].name=str;

                        t=n++;

                    }

                    s[t].a.next=a.getNext();

                    a.next=0;

                    break;

                }

            }

        }

        cin>>m;

        for(i=0;i<m;i++)

        {

            cin>>str>>num;

            t=find(str);

            getValue(t,num);

        }

        cout<<sum<<endl;

    }

}

 

你可能感兴趣的:(dota)