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; }
キューは便利ですね。