就是一道比较麻烦的模拟题,比赛的时候没有敲,赛后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 }