杭电 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;
    }
}

 

posted @ 2013-03-08 00:11  SF-_-  阅读(390)  评论(0编辑  收藏  举报