ivolff

J 3.0

Nov 16th, 2017
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.51 KB | None | 0 0
  1. #include <fstream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. struct queue{              
  7.     int name;
  8.     queue *left, *right;
  9. };
  10.  
  11.  
  12. class cqueue{              
  13.     queue  *head, *tail;    
  14.     long int length;                
  15.     long long int sum;          
  16.      
  17.     public:    
  18.     cqueue(){ head = NULL; tail = NULL; length = 0; sum = 0;}
  19.      
  20.     long int getLength(){return length;}        
  21.     long long int getSum() {return sum;}
  22.     queue *getHead(){return head;}
  23.     queue *getTail(){return tail;}
  24.      
  25.     void add_tail(long int m);      
  26.     long int leave();              
  27.     long int getkx(int k);          
  28.     void release();            
  29. };
  30.  
  31. void cqueue::add_tail(long int name){  
  32.     if(name <= 0) return;            
  33.                                      
  34.     queue *temp = new queue;        
  35.     temp->name = name;              
  36.     temp->right = NULL;              
  37.     if(tail){                      
  38.         tail->right = temp;          
  39.         temp->left = tail;          
  40.         tail = temp;                
  41.         sum += name;                
  42.     }else{          
  43.         head = tail = temp;    
  44.         head->left = 0;          
  45.         sum = name;            
  46.     }
  47.     length++;                  
  48. }
  49.  
  50. long int cqueue::leave(){          
  51.     if(!head) return 0;        
  52.     int Res = head->name;        
  53.     if(length == 1) {          
  54.         delete head;            
  55.         head = NULL;            
  56.         tail = NULL;
  57.         length = 0;            
  58.         sum = 0;
  59.         return Res;            
  60.     }
  61.     queue *temp = head;        
  62.     head = head->right;          
  63.     head->left = NULL;          
  64.     delete temp;                
  65.     length--;                  
  66.     sum -= Res;                
  67.     return Res;                
  68. }
  69.  
  70. long int cqueue::getkx(int k){      
  71.     queue *temp = head;        
  72.     long int Res = 0;              
  73.     while(temp){            
  74.         temp->name -= k;    
  75.         if(temp->name <= 0){  
  76.             queue *t = temp;    
  77.             Res += k + temp->name;  
  78.             if(temp->left)temp->left->right = temp->right;
  79.             else head = temp->right;
  80.             if(temp->right)temp->right->left = temp->left;
  81.             else tail = temp->left;      
  82.             temp = temp->right;      
  83.             sum -= t->name + k;      
  84.             delete t;              
  85.             length--;              
  86.         }else{  
  87.             Res += k;
  88.             sum -= k;  
  89.             temp = temp->right;
  90.         }
  91.     }
  92.     return Res;    
  93. }
  94.  
  95. int main(){
  96.     ifstream fin("bureaucracy.in");
  97.     ofstream fout("bureaucracy.out");
  98.     cqueue buro;            
  99.     long int n = 0, m= 0;      
  100.     fin>>n>>m;          
  101.     long int i = 0, name;
  102.     while(fin>>name && i++ < n){    
  103.         buro.add_tail(name);    
  104.     }
  105.     if(m >= buro.getSum()){  
  106.         fout<<"-1"<<endl;      
  107.     }else{          
  108.         long int k = m/buro.getLength();    
  109.         while(k){  
  110.             m -= buro.getkx(k);        
  111.             k = m/buro.getLength();    
  112.         }
  113.         for(long int i = 0; i < m; i++){    
  114.             long int n = buro.leave();      
  115.             buro.add_tail(n-1);        
  116.         }
  117.         fout<<buro.getLength()<<endl;
  118.         queue *temp = buro.getHead();  
  119.         while(temp) {                  
  120.             fout<<temp->name<<" ";  
  121.             temp = temp->right;          
  122.         }
  123.         fout<<endl;
  124.     }
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment