鱼C论坛

 找回密码
 立即注册
查看: 1531|回复: 1

发红包问题的时间复杂度

[复制链接]
发表于 2024-1-18 17:00:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题如下:
链接:https://ac.nowcoder.com/acm/contest/73762/B
来源:牛客网

在公司的年会上,有
N个人排着队准备毛红包,这些人按照从前到后的顺序排成一列,编号为1到N。
在活动期间,发生了Q次以下事件:
在时间Ti ,装有M i块钱的红包从空中飘下,站在队头的人得到该红包内的所有钱(如果队列中没有人,则没有人得到该红包)。然后,该人离开队列,并在时间T i+D i返回到原来的位置。

在所有Q次事件之后,请输出每个人获得的总金额数。

下面是我的代码,求大佬改进时间复杂度!

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;

  4. int main() {
  5.     ios::sync_with_stdio(0);
  6.     cin.tie(0);

  7.     long n, q;
  8.     ll time, money, dtime;

  9.     cin >> n >> q;

  10.     vector<ll> m(n, 1), dp(n, 1), rmb(n, 0); // Using vectors instead of maps for better performance.

  11.     for (ll i = 0; i < q; i++) {
  12.         cin >> time >> money >> dtime;

  13.         // Finding the first available position to perform the operation.
  14.         for (ll j = 0; j < n; j++) {
  15.             if (m[j] == 0) {
  16.                 if (dp[j] == time) {
  17.                     m[j] = 1;
  18.                 }
  19.                 else {
  20.                     continue;
  21.                 }
  22.             }

  23.             m[j] = 0;
  24.             dp[j] = time + dtime;
  25.             rmb[j] += money;

  26.             break; // Break after finding the first available position.
  27.         }
  28.     }

  29.     for (ll i = 0; i < n; i++) {
  30.         cout << rmb[i] << '\n';
  31.     }

  32.     return 0;
  33. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-17 03:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表