Problem 1219 : Pump up Batteries

Problem D: Pump up Batteries
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1219

  • 問題概要

ガードマン?たちは与えられたパターン通りに、活動する時間と充電する時間のとおりに動く。
充電器は一つなので、かぶったら並ぶ、どうじなら番号が若い順。
順番待ちで浪費する時間はどのくらい?

  • 解法

書くだけ。
キューが空の場合までアクセスしてしまってて、9回れんぞくランタイムエラー出したw
それ直せばすぐなおったので、わりとすぐかけたかも?

  • ソース
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<sstream>
#include<cassert>
#include<queue>
#include<stack>

#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C)     (C).begin(),(C).end()
#define pb         push_back
#define mp         make_pair
#define vint       vector<int>
#define FOR(it,o)  for(__typeof((o).begin()) it=(o).begin(); it!=(o).end(); ++it)
#define lli	    long long int
#define ld	    long double

using namespace std;

class Man{
public:
  int now, id, cnt;
  bool que, charge, nc;
  vint v;
  bool operator <(const Man &m)const{
    return id < m.id;
  }
  Man(){
    id = 0;
    cnt = 0;
    que = false;
    charge = false;
    nc = false;
    now = 0;
  }
  void next(){
    cnt++;
    nc = false;
    if(now >= v.size() || v[now] == cnt){
      cnt = 0;
      now++;
      charge = (!charge);
      nc = charge;
    }
    if(now >= v.size() || v[now] == 0){
      now = 0;
    }
  }
};


int main(){
  int n, time;
  while(cin >> n >> time){
    if( n + time == 0)break;
    
    Man m[n];
    rep(i, n){
      int tmp;
      m[i].id = i;
      while(cin >> tmp){
	m[i].v.pb(tmp);
	if(tmp == 0)break;
      }
    }
    int cnt = 0;
    queue<int> Q;
    rep(t, time){
      vint v;
      rep(i, n){
	if(m[i].que){
	  cnt++;
	}
	else {
	  m[i].next();
	  if(m[i].nc){
	    m[i].nc = false;
	    v.pb(m[i].id);
	    m[i].que = true;
	  }
	}
      }
      if(v.size() > 0){
	sort(ALL(v));
	FOR(it, v)Q.push(((*it)));
      }
      if(!Q.empty()){
	if(!(m[Q.front()].charge))Q.pop();
	if(!Q.empty())m[Q.front()].que = false;
      }     
    }
    cout  << cnt << endl;
  }
  return 0;
}

キューは便利ですね。