马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
问题如下:
链接:https://ac.nowcoder.com/acm/contest/73762/B
来源:牛客网
在公司的年会上,有
N个人排着队准备毛红包,这些人按照从前到后的顺序排成一列,编号为1到N。
在活动期间,发生了Q次以下事件:
在时间Ti ,装有M i块钱的红包从空中飘下,站在队头的人得到该红包内的所有钱(如果队列中没有人,则没有人得到该红包)。然后,该人离开队列,并在时间T i+D i返回到原来的位置。
在所有Q次事件之后,请输出每个人获得的总金额数。
下面是我的代码,求大佬改进时间复杂度!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
long n, q;
ll time, money, dtime;
cin >> n >> q;
vector<ll> m(n, 1), dp(n, 1), rmb(n, 0); // Using vectors instead of maps for better performance.
for (ll i = 0; i < q; i++) {
cin >> time >> money >> dtime;
// Finding the first available position to perform the operation.
for (ll j = 0; j < n; j++) {
if (m[j] == 0) {
if (dp[j] == time) {
m[j] = 1;
}
else {
continue;
}
}
m[j] = 0;
dp[j] = time + dtime;
rmb[j] += money;
break; // Break after finding the first available position.
}
}
for (ll i = 0; i < n; i++) {
cout << rmb[i] << '\n';
}
return 0;
}
|