1. 程式人生 > >1019. 程式猿和產品狗

1019. 程式猿和產品狗

在公司裡面,程式猿經常有一堆todolist要做,而這些todolist是產品經理分配給他們的。但是當程式設計師遇到不懂技術的產品狗時,就悲劇了。產品經理經常修改他們的todolist,比如:新增,減少他們的todolist。
請設計一個類CodeMonkey ,表示程式猿,另一個類ProductDog,表示產品經理。

  • CodeMonkey類有私有成員 name,todolist。建構函式初始化姓名和todolist,公有函式 int sizeof_todolist(), 來自ProductDog類的友元函式 add_todolist(CodeMonkey&,int),reduce_todolist(CodeMonkey& , int);
  • ProductDog類有公有函式 add_todolist(CodeMonkey&,int),reduce_todolist(CodeMonkey& , int)

Input Specification

每個測試檔案包含一組測試用例,對於每個測試用例,第一行輸入 n (1<= n <= 10^6)表示有n個程式設計師,接下去n行,每行為: name x 表示名為name的程式設計師的todolist的長度為x。 接下去一行 m (1<=m<=10^6),表示產品經理分配任務的次數。 接下去m行,每行為 name opt x , opt 為 0 表示名為name的程式猿的todolist增加x,opt為 1 表示減少x。 輸入資料保證合法性。

Output Specification

對於每個程式設計師,請輸出 name x,x表示最終的todolist長度。按輸入順序輸出。

Sample Input:

3
Jack 1
Luck 2
Tom  3
4
Tom   0 100
Luck  0 50
Jack  0 25
Tom   1 50
Sample Output:
Jack  26
Luck  52
Tom   53

時間限制 1000 ms 記憶體限制 65536 kB 程式碼長度限制 8192 B 判題程式 Standard 作者 etaf 來源 友元
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
class Product;
class CodeMonkey;
class ProductDog
{
  public:  
    void creat(CodeMonkey *,int ,int);  
    void add_todolist(CodeMonkey &,int);  
    void reduce_todolist(CodeMonkey &,int);
};
class CodeMonkey
{  friend void ProductDog::creat(CodeMonkey *,int ,int);
  friend void ProductDog::add_todolist(CodeMonkey &,int);
  friend void ProductDog::reduce_todolist(CodeMonkey &,int);
  friend void Qsort(CodeMonkey*,int,int);
  private :  
    string name;  
    int todolist,sign;
  public:  int turn_sign()  
      {    return sign;  }    
      string turn_name()  {    return name;  }  
      void cout_todolist()  {    cout<<name<<" "<<todolist<<endl;  }
      void creat(int len)  {    cin>>name>>todolist;      sign=len;  }
};
void ProductDog::add_todolist(CodeMonkey &b,int todolist)
{    
  b.todolist=b.todolist+todolist;
}
void ProductDog::reduce_todolist(CodeMonkey &b,int todolist)
{    
  b.todolist=b.todolist-todolist;
}
void ProductDog::creat(CodeMonkey *b,int n,int len)
{
  int a,front,len2,sign,todolist;
  string name;  
  while(n--)  
  {    
    front=0;
    len2=len;
    a=len/2;    
    cin>>name;    
    do{      
      if(b[a].name<name)
      {      
        front=a;      
      }else      
      {        
        len2=a;  
      }      
        a=(front+len2)/2;    
    }while(b[front].name!=name&&b[len2].name!=name);      
    if(b[front].name==name)
      a=front;
      else 
        a=len2;
    cin>>sign>>todolist;
    if(sign==0)add_todolist(b[a],todolist);
      if(sign==1)reduce_todolist(b[a],todolist);  
  }
}
template <typename T>
void swap(T *m,T *n)
{  
  T temp;  
  temp=*m;  
  *m=*n;  
  *n=temp;
}
void Qsort(CodeMonkey *a,int l,int r)
{  
  int i,j;  
  string name;  
  i=l;  
  j=r;  
  name=a[i].name;  
  do{    
    while(i<=j&&a[j].name>name)
      j--;    
    while(i<=j&&a[i].name<name)
      i++;    
    if(i<=j)
    {      
      swap(&a[i].name,&a[j].name);
      swap(&a[i].todolist,&a[j].todolist);
      swap(&a[i].sign,&a[j].sign);
      i++;    
      j--;    
    }  
  }while(i<=j);  
  if(l<j)Qsort(a,l,j);  
  if(i<r)Qsort(a,i,r);
}
CodeMonkey CM[1000000];
int main()
{  
  ProductDog PD;
  int n,add1,add,add2;
  cin>>n;
  add1=0;  
  while(add1<n)    
  {      
    CM[add1].creat(add1);    
    add1++;    
  }    
  Qsort(CM,0,add1-1);    
  cin>>n;    
  PD.creat(CM,n,add1-1);    
  add=0;    
  for(;add<add1;add++)  
  {      
    for(add2=0;add2<add1;add2++)      
    { 
      if(add==CM[add2].turn_sign())        
        CM[add2].cout_todolist();      
    }    
  }  
  return 0;
}