您的位置:首页 > 编程语言

PTA 7-4(队列) 银行排队问题之单窗口“夹塞”版(30 分) 30分代码

2017-10-10 18:40 711 查看
模拟一下

(注:博客作为交流使用,切勿抄袭应付作业)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <ctype.h>
#include <vector>
#include <algorithm>
#include <sstream>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
using namespace std;
typedef long long ll;
const int maxn = 10000 + 7;

int n, m, L, sum;
struct node {
string name;
int t, p, len;
}a[maxn];
bool vis[maxn];
vector<string> vec;
map<string, int> mp;

void init() {
memset(vis, false, sizeof vis);
sum = 0;
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; ++i) {
scanf("%d", &L);
string s;
for(int j = 0; j < L; ++j) {
cin >> s;
mp[s] = i;
//vec[i].push_back(s);
}
}
int cnt = m+1;
for(int i = 0; i < n; ++i) {
cin >> a[i].name;
if(mp[a[i].name] == 0) mp[a[i].name] = cnt++;
scanf("%d %d", &a[i].t, &a[i].p);
if(a[i].p > 60) a[i].p = 60;
}
//cout << mp["ANN"] << " === " << mp["AMY"] << endl;
}

void work(int pos, int id) {
for(int i = pos+1; i < n; ++i) {
if(!vis[i]) {
if(mp[a[i].name] == id) {
if(a[i].t <= sum) {
vis[i] = true;
a[i].len = sum - a[i].t;
sum += a[i].p;
vec.push_back(a[i].name);
}
else return;
}
}
}
}

void solve() {
for(int i = 0; i < n; ++i) {
if(!vis[i]) {
vis[i] = true;
if(a[i].t > sum) sum = a[i].t;
a[i].len = sum - a[i].t;
sum += a[i].p;
vec.push_back(a[i].name);
work(i, mp[a[i].name]);
}
}
for(int i = 0; i < vec.size(); ++i)
cout << vec[i] << endl;
sum = 0;
for(int i = 0; i < n; ++i) {
sum += a[i].len;
}
printf("%.1lf\n", 1.0*sum/n);
}

int main() {
init();
solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: