第三章 唯一剩下的 —— 外卖店优先级
//结构体排序
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1e5 + 10;
int flag[N]; //记录第id个商店的优先级
int tap[N];
int output[N];
struct node
{
int time;
int id;
}nodes[N];
bool cmp(node a, node b)
{
if (a.id != b.id)return a.id < b.id;
if (a.time != b.time)return a.time < b.time;
return a.time < b.time;
}
int main()
{
int n, m, t;
cin >> n >> m >> t;
//n个外卖店 m个订单 t时间内
for (int i = 0; i < m; i++)
cin >> nodes[i].time >> nodes[i].id;
sort(nodes, nodes + m, cmp);
// for (int i = 0; i < m; i++)cout << nodes[i].time << ' ' << nodes[i].id << endl;
int cnt = 0;
//计算每一个商店有几个订单
for (int i = 0; i < m; i++)
{
if (nodes[i].id == nodes[i + 1].id)tap[cnt]++;
else tap[cnt]++, cnt++;
}
int k = 0; //指向有效订单从0 指向m
for (int i = 0, k = 0; i < n; i++) //讨论每一个商店
{
//每个商店有tap[i]个订单
for (int j = nodes[k].time, tmp = 0; j <= t; j++) //一共遍历的时间
{
// cout << flag[i] << ' ' << j << endl;
if (flag[i] > 5)output[i] = 1;
if (flag[i] <= 3)output[i] = 0;
int yy = 0;
while((j == nodes[k].time) && (tmp < tap[i])) flag[i] += 2, k++,tmp++,yy = 1;
if (flag[i] > 5)output[i] = 1;
if (flag[i] <= 3)output[i] = 0;
if (yy == 1)continue;
if (tmp >= tap[i]) flag[i] -= 1;
else if (j != nodes[k].time) flag[i] -= 1;
if (flag[i] <= 0) flag[i] = 0;
if (flag[i] > 5)output[i] = 1;
if (flag[i] <= 3)output[i] = 0;
}
}
int ans = 0;
for (int i = 0; i < n; i++)
{
cout << flag[i] << endl;
if ( flag[i] >= 4 && output[i] ==1)ans++; //上过>5 并且现在不能小于
}
cout << endl << ans << endl;
return 0;
}
我一开始的做法:按照他的要求,踢皮球一般看一个要求写一些。没有全局观,导致TEL。