电梯上下
某大楼有一部电梯,初始电梯内没有乘客,乘客出现顺序保存在数组 passengers 中,passengers[i]格式为from to,分别表示乘客所在的楼层和想去的楼层。
假设乘客按顺序一个一个出现,当前乘客 passengers[i] 进入电梯且电梯关门后,后一个乘客 passengers[i+1] 立刻出现并等待。
电梯搭载规则如下:
· 当电梯内无乘客时,立即去接当前等待乘客。
· 当电梯内有乘客时:
· 将电梯内乘客都送到之前,电梯不会改变运行方向。
· 若电梯经过当前等待乘客所在楼层、且运行方向与当前等待乘客想去的方向一致,就会顺路搭载当前等待乘客。
假设电梯能携带的乘客数量没有限制,请计算电梯运送完最后一个乘客时,总共运行了多少层的距离。
输入
首行两个整数num initFloor,分别表示乘客的个数和电梯初始所在的楼层,1 <= num <= 100,1 <= initFloor <= 100
接下来 num 行表示passengers信息,passengers[i]格式为from to,分别表示乘客所在的楼层和想去的楼层,1 <= from <= 100,1 <= to <= 100,from != to
输出
一个整数,表示电梯总共运行了多少层的距离
样例
输入样例 1
3 50
12 66
25 27
26 83
输出样例 1
109
输入样例 1
4 50
50 10
40 20
30 100
30 100
输出样例 1
270
class Solution {
public:
bool isS(pair<int, int> info, bool upOrDown, int curSFloor) {
int startF = info.first;
int endF = info.second;
bool curUOD = startF > endF ? false : true;
if (curUOD) {
if (startF > curSFloor) {
return true;
}
} else {
if (startF < curSFloor) {
return true;
}
}
return false;
}
int CalcDistance(int initFloor, vector<pair<int, int>>& peopleInfo) {
int curSFloor = peopleInfo[0].first;
int curEFloor = peopleInfo[0].second;
bool upOrDown = (curSFloor > curEFloor) ? false : true;
int res = abs(initFloor - curSFloor);
for (int i = 1; i < peopleInfo.size(); i++) {
vector<int> floor;
while (isS(peopleInfo[i], upOrDown, curSFloor) && i < peopleInfo.size()) {
floor.push_back(peopleInfo[i].first);
floor.push_back(peopleInfo[i].second);
i++;
}
floor.push_back(curEFloor);
floor.push_back(curSFloor);
sort(floor.begin(), floor.end());
for (int j = 0; j < floor.size() - 1; j++) {
res += abs(floor[j] - floor[j + 1]);
}
if (i < peopleInfo.size()) {
curSFloor = peopleInfo[i].first;
curEFloor = peopleInfo[i].second;
int last = upOrDown ? floor[floor.size() - 1] : floor[0];
res += abs(last - curSFloor);
upOrDown = (curSFloor > curEFloor) ? false : true;
} else {
return res;
}
}
return res + abs(curSFloor - curEFloor);
}
};
生产线AC-难忘的体验!!
class ProductionLineMgmtSys {
public:
map<int, int> numPer;
ProductionLineMgmtSys(int num, const vector<int>& periods)
{
for (int i = 0; i < periods.size(); i++) {
numPer[i] = periods[i];
}
}
map<int, int> assemblyPro;
map<int, vector<tuple<int, int, int>>> mp;
int Produce(int date, int assemblyId, int productId)
{
if (!assemblyPro.count(assemblyId)) {
assemblyPro[assemblyId] = productId;
mp[assemblyId].push_back(make_tuple(productId, date, -1));
return 1;
}
if (assemblyPro.count(assemblyId)) {
if (assemblyPro[assemblyId] == productId) {
return 0;
} else {
get<2>(mp[assemblyId].back()) = date;
}
}
assemblyPro[assemblyId] = productId;
mp[assemblyId].push_back(make_tuple(productId, date, -1));
return -1;
}
int GetProductCount(int date, int productId)
{
vector<tuple<int, int>> target;
for (auto ele : mp) {
vector<tuple<int, int, int>> vec = ele.second;
for (auto e : vec) {
if (get<0>(e) == productId) {
if (get<2>(e) == -1) {
target.push_back(make_tuple(get<1>(e), date));
} else {
target.push_back(make_tuple(get<1>(e), get<2>(e)));
}
}
}
}
int count = 0;
int per = numPer[productId];
for (int i = 0; i < target.size(); i++) {
int start = get<0>(target[i]);
int end = get<1>(target[i]);
int cur = start + per;
while (cur <= end) {
count++;
cur += per;
}
}
return count;
}
};
系统设计_步数冠军_求最大值变化的次数.cpp
class Solution {
public:
vector<int> getIndex(vector<int> baseScores, int maxScore) {
vector<int> index;
for (int i = 0; i < baseScores.size(); i++) {
if (maxScore == baseScores[1]) {
index.push_back(i);
}
}
return
}
int ChangeRanking(vector<int> &baseScores, vector<vector<int>> &ranks) {
map<int, vector<tuple<int, int>>> ranksMap;
for (auto rank : ranks) {
int day = rank[0];
int id = rank[1];
int step = rank[2];
ranksMap[day].push_back(make_tuple(id, step));
}
int totalDay = ranksMap.size();
int maxScore = *max_element(baseScores.begin(), baseScores.end());
vector<int> preIdxVec = getIndex(baseScores, maxScore);
int res = 0;
for (int i = 1; i <= totalDay; i++) {
auto iter = find(ranksMap.begin(), ranksMap.end(), i);
if (iter == ranksMap.end()) {
continue;
}
for (auto ele : iter->second) {
int curId = get<0>(ele);
int curStep = get<1>(ele);
baseScores[curId] += curStep;
}
maxScore = *max_element(baseScores.begin(), baseScores.end());
vector<int> curIdxVec = getIndex(baseScores, maxScore);;
if (curIdxVec.size() != preIdxVec.size() || curIdxVec != preIdxVec) {
res++;
}
preIdxVec = curIdxVec;
}
return res;
}
};