HDU 4269 Defend Jian Ge [模拟]

  就是一道比较麻烦的模拟题,比赛的时候没有敲,赛后1A了。。

  其实主要是输入比较麻烦,买东西合成物品什么的暴力一点也不会出错的。

  代码写的后丑,A了之后也懒的改了。。

复制代码
  1 #include <string.h>
  2 #include <stdio.h>
  3 #include <string>
  4 #include <sstream>
  5 #include <iostream>
  6 using namespace std;
  7 struct equip{
  8     string name;
  9     int val,type;
 10     string mix[6];
 11     int mixn[6],mixs;
 12 }eq[61];
 13 struct pack{
 14     int size;
 15     string name[10];
 16     int num[10];
 17     int val[10];
 18     int type[10];
 19     void init(){size=0;}
 20     int getpid(string nm){
 21         for(int i=0;i<size;i++)
 22             if(nm==name[i])return i;
 23         return -1;
 24     }
 25     int cont(string nm){
 26         int tot=0;
 27         for(int i=0;i<size;i++)
 28             if(nm==name[i])tot++;
 29         return tot;
 30     }
 31     int remove(string nm){
 32         int x=getpid(nm),ans=num[x]*val[x];
 33         for(int i=x;i<size-1;i++)
 34             name[i]=name[i+1],num[i]=num[i+1],type[i]=type[i+1],val[i]=val[i+1];
 35         size--;
 36         return ans;
 37     }
 38     int add(string nm,int tp,int v){
 39         if(size==6)return -1;
 40         int x=getpid(nm);
 41         if(x!=-1&&tp==3)
 42             num[x]++;
 43         else
 44             name[size]=nm,num[size]=1,type[size]=tp,val[size]=v,size++;
 45         return 0;
 46     }
 47 }pk;
 48 int n1,n2,n3,ns,op,tmp,gold;
 49 string line,s1,s2;
 50 int mixd[10],mixn[10],mixs;
 51 int getid(string name){
 52     for(int i=0;i<ns;i++)if(eq[i].name==name)return i;
 53     return -1;
 54 }
 55 void getmix(string now){
 56     int id=getid(now);
 57     if(eq[mixd[0]].type!=2)return;
 58     for(int i=0;i<eq[id].mixs;i++){
 59         mixd[mixs]=getid(eq[id].mix[i]);
 60         mixn[mixs]=eq[id].mixn[i];
 61         mixs++;
 62     }
 63 }
 64 int ttval;
 65 void getval(int id){
 66     ttval+=eq[id].val;
 67     if(eq[id].type!=2)return;
 68     for(int i=0;i<eq[id].mixs;i++){
 69         for(int j=0;j<eq[id].mixn[i];j++){
 70             getval(getid(eq[id].mix[i]));
 71         }
 72     }
 73     return;
 74 }
 75 int main(){
 76     freopen("test.in","r",stdin);
 77     int ca=1;
 78     while(cin>>n1){
 79         for(int i=0;i<n1;i++){
 80             cin>>eq[i].name>>eq[i].val;
 81             eq[i].type=1;
 82         }
 83         cin>>n2;
 84         getline(cin,line);
 85         for(int i=n1;i<n1+n2;i++){
 86             getline(cin,line);
 87             unsigned p1=line.find(':'),p2;
 88             stringstream ss(line.substr(0,p1));
 89             ss>>eq[i].name>>eq[i].val;
 90             eq[i].mixs=0,eq[i].type=2;
 91             line=line.substr(p1+=1,line.length());
 92             for(int k=0,p=0;line.length()!=0&&k<=line.length();k++){
 93                 if(k==line.length()||line[k]==','){
 94                     stringstream ss(line.substr(p,k));
 95                     ss>>eq[i].mix[eq[i].mixs]>>eq[i].mixn[eq[i].mixs];
 96                     eq[i].mixs++;
 97                     p=k+1;
 98                 }
 99             }
100         }
101         cin>>n3;
102         for(int i=n1+n2;i<n1+n2+n3;i++){
103             cin>>eq[i].name>>eq[i].val;
104             eq[i].type=3;
105         }
106         ns=n1+n2+n3;
107 
108         cin>>op;
109         gold=0,pk.init();
110         while(op--){
111             cin>>line;
112             if(line[0]=='+'&&line[1]>='0'&&line[1]<='9'){
113                 stringstream ss(line.substr(1,line.length()));
114                 ss>>tmp;
115                 gold+=tmp;
116             }else if(line[0]=='+'){
117                 line=line.substr(1,line.length());
118                 mixs=1;
119                 mixd[0]=getid(line),mixn[0]=1;
120                 getmix(line);
121                 //背包中是否都有合成需要的物品
122                 bool has=1;
123                 for(int i=1;i<mixs;i++)
124                     if(pk.cont(eq[mixd[i]].name)<mixn[i])has=0;
125                 if(has==0)continue;
126                 //剩下的钱是否足够购买合成卷轴或者是否足够购买这件装备
127                 if(gold<eq[mixd[0]].val)continue;
128                 //把合成卷轴的所需的物品删掉(如果非合成物品不会删除东西)
129                 for(int i=1;i<mixs;i++){
130                     for(int j=0;j<mixn[i];j++)gold+=pk.remove(eq[mixd[i]].name);
131                 }
132                 //放入新物品
133                 ttval=0;
134                 getval(mixd[0]);//获得这件物品的真实价值
135                 if(-1!=pk.add(line,eq[mixd[0]].type,ttval)){
136                     gold-=ttval;
137                 }
138             }else if(line[0]=='-'){
139                 line=line.substr(1,line.length());
140                 if(pk.getpid(line)!=-1)gold+=pk.remove(line);
141             }
142         }
143         cout<<"Case "<<ca++<<":"<<endl;
144         cout<<gold<<endl;
145         cout<<pk.size<<endl;
146         int vis[10],minid;
147         memset(vis,0,sizeof vis);
148         for(int i=0;i<pk.size;i++){
149             minid=-1;
150             for(int j=0;j<pk.size;j++)
151                 if(vis[j]==0&&(minid==-1||pk.name[j]<=pk.name[minid]))minid=j;
152             vis[minid]=1;
153             cout<<pk.name[minid]<<": "<<pk.num[minid]<<endl;
154         }
155         cout<<endl;
156     }
157 }
复制代码
posted @   Burn_E  阅读(325)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示