• 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 }
  • 相关阅读:
    Python之 continue继续循环
    Python之 break退出循环
    Python之 while循环
    Python之 for循环
    java中collection、map、set、list简介 (转)
    CloudSim介绍和使用
    智能指针和动态内存
    boost signal2
    boost 信号 :
    boost库 线程使用
  • 原文地址:https://www.cnblogs.com/swm8023/p/2679424.html
Copyright © 2020-2023  润新知