首页 > 编程语言 >UVA-822 客户中心模拟 题解答案代码 算法竞赛入门经典第二版

UVA-822 客户中心模拟 题解答案代码 算法竞赛入门经典第二版

时间:2023-03-07 11:02:04浏览次数:131  
标签:pq return int 题解 rhs pers flag UVA 822


​GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版​

AC代码

这个题目的做法可能并不唯一,对于某些场景有不同的答案也能过。

我的思路:

是任务选人,而不是人选任务,对于每个任务,首先选择对该任务有最高优先级的人(有多个则按照规则再选)。如果没有最高优先级的,就再选次高优先级的人。

但是如果同时有多个任务到达,应该首先选择哪个任务进行分配呢?

分配任务的不同顺序是会影响答案的结果的。我的答案中没考虑分配任务的问题就就AC了。因此对于某些场景,本题答案应该并不唯一。而且比较其他AC的答案,对于某些输入我的结果和别人的结果也不同。

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>

using namespace std;

struct REQ {
int id, num, elap, serv, btwe;
};
vector<REQ> reqs;

struct PER {
int id;
vector<int> v;
int eart, endt;
};
vector<PER> pers;
int MAXTOPLEN;

struct TIME {
int t;
int flag;
int i;
bool operator== (const TIME & rhs) const {
if(this->t == rhs.t && this->i == rhs.i && this->flag == rhs.flag) {
return true;
}
return false;
}
bool operator< (const TIME & rhs) const {
if(this->t != rhs.t) {
return this->t < rhs.t;
}
if(this->flag != rhs.flag)
return this->flag < rhs.flag;
return this->i < rhs.i;
}
bool operator> (const TIME & rhs) const {
if(*this == rhs || *this < rhs) {
return false;
}
return true;
}
};

bool cmp(const TIME & lhs, const TIME & rhs) {
if(lhs.t != rhs.t) {
return lhs.t < rhs.t;
}
return lhs.i < rhs.i;
}

int judgePer(int i, int j) {
if(pers[i].eart > pers[j].eart) {
return j;
}
if(pers[i].eart < pers[j].eart) {
return i;
}
if(pers[i].id > pers[j].id) {
return j;
}
if(pers[i].id < pers[j].id) {
return i;
}
}

int choosePerson(int r, int t) {
int i, j, k;
bool flag;
int choose;
for(i = 0; i < MAXTOPLEN; ++i) {
flag = false;
for(j = 0; j < pers.size(); ++j) {
if(pers[j].v.size() <= i || pers[j].endt > t) {
continue;
}
if(pers[j].v[i] == reqs[r].id) {
if(flag == false) {
flag = true;
choose = j;
} else {
choose = judgePer(j, choose);
}
}
}
if(flag == true) {
return choose;
}
}
return -1;
}


int simulate() {
int t = 0, i, j, k;
TIME ti, tt;
priority_queue<TIME, vector<TIME>, greater<TIME>> pq;
queue<int> qth;
for(i = 0; i < reqs.size(); ++i) {
for(j = 0; j < reqs[i].num; ++j) {
TIME tim;
tim.t = reqs[i].elap + reqs[i].btwe * j;
tim.i = i;
tim.flag = 1;
pq.push(tim);
}
}

while(pq.size() || qth.size()) {
if(pq.size()) {
ti = pq.top();
pq.pop();
if(ti.flag > 0) {
qth.push(ti.i);
}
t = ti.t;
while(pq.size()) {
tt = pq.top();
if(tt.t == t) {
if(tt.flag > 0) {
qth.push(tt.i);
}
pq.pop();
} else {
break;
}
}
}
k = qth.size();
for(i = 0; i < k; ++i) {
j = qth.front();
qth.pop();
int perCho = choosePerson(j, t);
if(perCho < 0) {
qth.push(j);
continue;
}
pers[perCho].eart = t;
pers[perCho].endt = t + reqs[j].serv;
TIME tim;
tim.t = pers[perCho].endt;
tim.flag = -1;
pq.push(tim);
}
}
return t;
}


int main() {
int m, n, i, j, k, t = 0;
while(cin >> m && m != 0) {
reqs.clear();
pers.clear();
MAXTOPLEN = 0;
while(m--) {
REQ r;
cin >> r.id >> r.num >> r.elap >> r.serv >> r.btwe;
reqs.push_back(r);
}
cin >> n;
while(n--) {
PER p;
cin >> p.id >> i;
if(i > MAXTOPLEN) {
MAXTOPLEN = i;
}
while(i--) {
cin >> j;
p.v.push_back(j);
}
p.eart = 0;
p.endt = 0;
pers.push_back(p);
}
k = simulate();
cout << "Scenario " << ++t << ": All requests are serviced within " << k << " minutes." << endl;
}
return 0;
}

标签:pq,return,int,题解,rhs,pers,flag,UVA,822
From: https://blog.51cto.com/u_15995687/6105506

相关文章

  • UVA-12333 Fibonacci的复仇 题解答案代码 算法竞赛入门经典第二版
    ​​GitHub-jzplp/aoapc-UVA-Answer:算法竞赛入门经典例题和习题答案刘汝佳第二版​​算法竞赛入门经典书中给出了大数类的算法,直接照抄即可。我的做题过程:1.照着书......
  • UVA-1596 找bug 题解答案代码 算法竞赛入门经典第二版
    ​​GitHub-jzplp/aoapc-UVA-Answer:算法竞赛入门经典例题和习题答案刘汝佳第二版​​AC代码有个点需要注意:ASCII中,在Z和a中间还有6个字符,因此数组开大一点比较好。ge......
  • UVA-1598 交易所 题解答案代码 算法竞赛入门经典第二版
    ​​GitHub-jzplp/aoapc-UVA-Answer:算法竞赛入门经典例题和习题答案刘汝佳第二版​​AC代码有意思的一个题目。书上说这是一个不错的优先队列练习题,但实际上它其实是......
  • PAT 乙级 1014 题解 (Basic Level) Practice
    很简单的一道题,我的程序有点乱#include<stdio.h>#include<string.h>#include<ctype.h>intmain(){chars1[61];chars2[61];chars3[61];chars4[61];s......
  • [CF1648D]Serious Business 题解
    [CF1648D]SeriousBusiness题解首先容易想到一个\(dp\)转移式子:\[dp_{i}=\max_{j\lei}s_{1,j}-cost_{j,i}-s_{2,j-1}+s_{2,i}+s_{3,n}-s_{3,i-1}\]其中\(dp_i\)......
  • NOI2023春测题解
    NOI2023春测题解目录NOI2023春测题解更好的阅读体验戳此进入游记戳此进入T1LG-P9117[春季测试2023]涂色游戏题面SolutionCodeT2LG-P9118[春季测试2023]幂次题面So......
  • 春季测试2023全题解
    T1涂色游戏非常困难的题目,我们需要记录每一行/每一列最后一次被修改的时间以及被修改成什么颜色。输出的时候每一个格子是受行影响还是列影响即可。复杂度\(O(nm)\)。......
  • [SDOI2019] 移动金币 题解
    首先考虑一个状态什么时候是合法的。不难把游戏过程抽象为阶梯Nim博弈。根据阶梯Nim博弈的结论,先手必胜当且仅当奇数位上的异或和不为0。考虑将本题中每个棋子后面......
  • AcWing 4490. 染色题解
    题目描述样例输入:612215211111输出3算法描述思路我们以样例为例讲讲思路。如何确保dfs能顺利便利呢,我们可以使用链式前向星来存图(树)C++代......
  • AcWing 4495. 数组操作题解
    思路此题较为简单,简述一下思路。从小到大排序,每次选取最小值,只要不为0即可每次都为序列减去一个数字太慢,但每个数又减去的数字一样,所以可以用minus记录每个数要减去的数......