题意:模拟RPG,表示没玩过魔兽的很伤~~
题解:需要注意的是,格子只有6个,如果格子满了能得到东西,即使有足够的钱,即使格子里有consume物品也不能买相同的consume物品,但是可以合成需要物品总数
不为0的物品。开始想把所有合成的物品的价格处理出来,但是由于给定的顺序不定,合成物品的物品还可能是合成的,这样需要给物品标定等级,dfs太麻烦,想想
由于是模拟,合成物品是按照给定的指令来的,在格子中的物品是有价格的,所以没必要处理合成物品的价格了。
Sure原创,转载请注明出处。
#include <iostream> #include <cstdio> #include <memory.h> #include <string.h> #include <algorithm> #define MAX(a , b) ((a) > (b) ? (a) : (b)) using namespace std; const int maxn = 22; const int maxm = 8; struct node { char name[maxn]; int price; }th[maxn],consume[maxn]; struct thing { char name[maxn]; int need,cnt; char dic[maxm][maxn]; int num[maxm]; }com[maxn]; struct SS { char name[maxn]; int num,price; bool valid; bool operator < (const SS &other) const { return strcmp(name , other.name) <= 0; } }bag[maxm]; char str[1000]; int m,n1,n2,n3,top,cas = 0; int change(char *s) { int res = 0; for(int i=0;s[i] != '\0';i++) { res *= 10; res += s[i] - '0'; } return res; } void read() { printf("Case %d:\n",++cas); for(int i=0;i<n1;i++) { getchar(); scanf("%s %d",th[i].name,&th[i].price); } scanf("%d",&n2); getchar(); for(int i=0;i<n2;i++) { gets(str); char *g = NULL; g = strtok(str , ",: \t"); strcpy(com[i].name , g); g = strtok(NULL , ",: \t"); com[i].need = change(g); com[i].cnt = 0; g = strtok(NULL , ",: \t"); while(g != NULL) { strcpy(com[i].dic[com[i].cnt] , g); g = strtok(NULL , ",: \t"); com[i].num[com[i].cnt++] = change(g); g = strtok(NULL , ",: \t"); } } scanf("%d",&n3); for(int i=0;i<n3;i++) { getchar(); scanf("%s %d",consume[i].name,&consume[i].price); } return; } void update() { int j = 0; for(int i=0;i<6;i++) { while(j < 6 && bag[j].valid) { j++; } if(bag[i].valid == false) continue; if(i > j) { bag[j] = bag[i]; bag[i].valid = false; bag[j++].valid = true; } } top = j; return; } void solve() { scanf("%d",&m); getchar(); int money = 0; top = 0; for(int i=0;i<6;i++) { bag[i].valid = bag[i].num = 0; } while(m--) { char c = getchar(); gets(str); if(str[0] >= '0' && str[0] <= '9') { money += change(str); } else { if(c == '+') { bool flag = false; for(int i=0;i<n1;i++) { if(strcmp(th[i].name , str) == 0) { flag = true; if(money >= th[i].price) { if(top == 6) break; strcpy(bag[top].name , str); bag[top].num = 1; bag[top].price = th[i].price; bag[top].valid = true; top++; money -= th[i].price; } break; } } if(flag) continue; for(int i=0;i<n2;i++) { if(strcmp(com[i].name , str) == 0) { flag = true; if(com[i].need > money) break; bool have = true; int c = 0; for(int j=0;j<com[i].cnt;j++) { c += com[i].num[j]; int t = 0; for(int k=0;k<top;k++) { if(strcmp(bag[k].name , com[i].dic[j]) == 0) { t++; } } if(t < com[i].num[j]) { have = false; break; } } if(have && (top < 6 || c > 0)) { money -= com[i].need; int tot = com[i].need; for(int j=0;j<com[i].cnt;j++) { int t = 0; for(int k=0;k<top;k++) { if(strcmp(bag[k].name , com[i].dic[j]) == 0 && bag[k].valid) { bag[k].valid = false; tot += bag[k].price; if(++t == com[i].num[j]) { break; } } } } for(int j=0;j<=top;j++) { if(bag[j].valid == false) { bag[j].valid = true; bag[j].num = 1; strcpy(bag[j].name , com[i].name); bag[j].price = tot; if(j == top) top++; break; } } update(); } break; } } if(flag) continue; for(int i=0;i<n3;i++) { if(strcmp(consume[i].name , str) == 0) { flag = true; if(money >= consume[i].price) { if(top == 6) break; money -= consume[i].price; bool have = false; for(int j=0;j<top;j++) { if(strcmp(bag[j].name , str) == 0) { have = true; bag[j].num++; bag[j].price += consume[i].price; break; } } if(have == false) { strcpy(bag[top].name , str); bag[top].num = 1; bag[top].price = consume[i].price; bag[top++].valid = true; } } break; } } } else { for(int i=0;i<top;i++) { if(strcmp(bag[i].name , str) == 0) { bag[i].valid = false; money += bag[i].price; update(); break; } } } } } sort(bag , bag + top); printf("%d\n%d\n",money,top); for(int i=0;i<top;i++) { printf("%s: %d\n",bag[i].name,bag[i].num); } puts(""); return; } int main() { while(~scanf("%d",&n1)) { read(); solve(); } return 0; }