题目描述
“饱了么”外卖系统中维护着 N NN 家外卖店,编号 1 ∼ N 1∼N1∼N。
每家外卖店都有一个优先级,初始时 (0 00 时刻) 优先级都为 0 00。
每经过 1 11 个时间单位,如果外卖店没有订单,则优先级会减少 1 11,最低减到 0 00;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2 22。
如果某家外卖店某时刻优先级大于 5 55,则会被系统加入优先缓存中;如果优先级小于等于 3 33,则会被清除出优先缓存。
给定 T TT 时刻以内的 M MM 条订单信息,请你计算 T TT 时刻时有多少外卖店在优先缓存中。
输入格式
第一行包含 3 33 个整数 N , M , T 。 N,M,T。N,M,T。
以下 M MM 行每行包含两个整数 t s tsts 和 i d idid,表示 t s tsts 时刻编号 i d idid 的外卖店收到一个订单。
输出格式
输出一个整数代表答案。
数据范围
1 ≤ N , M , T ≤ 105 , 1≤N,M,T≤105,1≤N,M,T≤105,
1 ≤ t s ≤ T , 1≤ts≤T,1≤ts≤T,
1 ≤ i d ≤ N 1≤id≤N1≤id≤N
输入样例1:
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
1
2
3
4
5
6
7
输出样例1:
1
#include <iostream>
#include <cstdio>
#include<time.h>
#include<vector>
#include<algorithm>
#include<string>
#include<fstream>
#include<map>
using namespace std;
typedef pair<int, int> pii;
bool mysort(const pii& a, const pii& b) {
if (a.first != b.first)
return a.first < b.first;
else return a.second < b.second;
}
int book[10000][10000] = { 0 };
int main() {
int n, m, t;
cin >> n >> m >> t;
vector<int> store;
for (int i = 0; i < n; i++) {
store.push_back(0);
}
vector<pii> pa;
for (int i = 0; i < m; i++) {
int fi, se;
cin >> fi >> se;
se--;
pii pi = { se,fi };
pa.push_back(pi);
}
sort(pa.begin(), pa.end(), mysort);
int pre = 0;
for (int i = 0; i < pa.size(); i++) {
book[pa[i].first][pa[i].second]++;
}
cout << "done";
for (int i = 0; i < n; i++) {
for (int j = 1; j <= t; j++) {
if (book[i][j] == 0) {
if (store[i] == 0) continue;
else store[i]--;
}
else store[i] += 2*book[i][j];
}
}
int ans = 0;
for (int i = 0; i < store.size(); i++) {
cout << store[i] << "!" << endl;
if (store[i] > 5) ans++;
}
cout << ans;
}
一个数组 若要开10000*10000及以上的空间 需要设置成全局数组,局部数组只能分配2M