1361:产生数(Produce)

文章讨论了如何利用队列和变换规则计算一个整数经过任意次数变换后生成的不同整数个数,给出了一个C++AC代码示例。

【题目描述】

给出一个整数n(n≤2000)和k个变换规则(k≤15)。规则:

① 1个数字可以变换成另1个数字;

② 规则中,右边的数字不能为零。

例如:n=234,k=2规则为

2 → 5

3 → 6

上面的整数234经过变换后可能产生出的整数为(包括原数)234,534,264,564共4种不同的产生数。

求经过任意次的变换(0次或多次),能产生出多少个不同的整数。仅要求输出不同整数个数。

【输入】

n

k

x1        y1

x2        y2

…       …

xn       yn

【输出】

格式为一个整数(满足条件的整数个数)。

【输入样例】

234
2
2 5
3 6

【输出样例】

4

【AC代码】

用队列做:

#include <bits/stdc++.h>
using namespace std;

int main()
{
  int n,k,cnt=1,a[17],b[17];
  cin>>n>>k;
  bool v[10005]= {};
  for(int i=1; i<=k; i++)
  {
    cin>>a[i]>>b[i];
  }
  queue<int> s;
  s.push(n);
  v[n]=1;
  while(!s.empty())
  {
    int sum=1;
    int f=s.front(),y=s.front();
    s.pop();
    while(y)
    {
      int m=y%10;
      y/=10;
      for(int i=1; i<=k; i++)
      {
        if(m==a[i])
        {
          int x=f+(b[i]-a[i])*sum;
          
          if(v[x]==0)
          {
		    s.push(x);
            v[x]=1;
            cnt++;
          }

        }
      }
      sum*=10;
    }
  }
  cout<<cnt;
  return 0;
}

1937 packend : 411937 take : 411938 produce : 411607, media type: 0 aggstart : 411938 agging : 411938 pack : 411938 produce : 411938, media type: 1 take : 411939 aggstart : 411939 agging : 411939 pack : 411939 take : 411940 produce : 411939, media type: 0 aggstart : 411940 agging : 411940 pack : 411940 take : 411940 take : 411941 take : 411941 take : 411941 take : 411941 take : 411941 take : 411941 take : 411941 take : 411941 take : 411942 take : 411942 take : 411942 take : 411942 produce : 411942, media type: 0 aggstart : 411942 agging : 411942 pack : 411942 produce : 411942, media type: 0 take : 411942 aggstart : 411942 agging : 411942 pack : 411942 produce : 411942, media type: 1 take : 411943 aggstart : 411943 agging : 411943 pack : 411943 produce : 411943, media type: 0 take : 411944 aggstart : 411944 agging : 411944 produce : 411944, media type: 0 pack : 411944 take : 411944 aggstart : 411944 agging : 411944 pack : 411944 produce : 411944, media type: 0 take : 411944 aggstart : 411944 agging : 411944 pack : 411944 produce : 411944, media type: 1 take : 411944 produce : 411944, media type: 0 aggstart : 411944 agging : 411944 pack : 411944 take : 411944 aggstart : 411944 agging : 411944 pack : 411944 produce : 411944, media type: 0 take : 411944 aggstart : 411944 agging : 411944 pack : 411944 produce : 411944, media type: 0 take : 411944 aggstart : 411944 agging : 411944 pack : 411944 produce : 411944, media type: 1 take : 411944 produce : 411944, media type: 0 aggstart : 411944 agging : 411944 pack : 411944 take : 411944 aggstart : 411944 agging : 411944 pack : 411945 produce : 411944, media type: 0 take : 411945 aggstart : 411945 agging : 411945 pack : 411945 produce : 411945, media type: 0 take : 411945 aggstart : 411945 agging : 411945 pack : 411945 take : 411945 take : 411945 produce : 411945, media type: 1 take : 411945 produce : 411945, media type: 0 aggstart : 411945 agging : 411945 pack : 411945 take : 411946 aggstart : 411946 agging : 411946 pack : 411946 produce : 411946, media type: 0 take : 411946 aggstart : 411946 agging : 411946 pack : 411946 produce : 411946, media type: 0 take : 411946 aggstart : 411946 agging : 411946 pack : 411946 produce : 411946, media type: 0 take : 411946 aggstart : 411946 agging : 411946 pack : 411946 produce : 411946, media type: 1 take : 411946 produce : 411946, media type: 0 aggstart : 411946 agging : 411946 pack : 411946 take : 411946 aggstart : 411946 agging : 411946 pack : 411947 produce : 411946, media type: 0 take : 411947 aggstart : 411947 agging : 411947 pack : 411947 produce : 411947, media type: 0 take : 411947 produce : 411947, media type: 1 aggstart : 411947 agging : 411947 pack : 411947 take : 411947 produce : 411947, media type: 0 aggstart : 411947 agging : 411947 pack : 411947 take : 411948 aggstart : 411948 agging : 411948 pack : 411948 produce : 411948, media type: 0 take : 411948 aggstart : 411948 agging : 411948 pack : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411948 take : 411949 take : 411949 take : 411949 take : 411949 take : 411949 take : 411949 take : 411949 在连续打印时间戳的时候为什么会出现时间跳变
最新发布
12-28
在连续打印时间戳时出现时间跳变(即时间戳不连续或“跳跃”)的现象,通常是由以下几个原因导致的: ### 1. **系统调度延迟** 操作系统是多任务的,进程/线程可能被中断、挂起或抢占。即使代码逻辑上是连续执行的,实际运行中可能会因为 CPU 被其他高优先级任务占用而产生延迟,导致日志时间戳出现跳变。 > 示例:某个 `take` 操作本应在 411948 后立即发生,但线程被阻塞,直到 411949 才恢复执行。 --- ### 2. **日志输出缓冲机制** 日志可能是缓存后批量写入的。尤其是异步日志或多线程环境下,日志写入时间和实际事件发生时间存在偏差。 > 比如:事件发生在 411948,但由于缓冲未刷新,日志延迟到 411949 才输出。 --- ### 3. **多个线程并发写入** 从你的日志看,同一个时间戳(如 `411944`)下有大量 `take` 和 `produce` 操作密集出现,这表明可能存在多个线程同时工作,并且它们使用的是系统时间戳记录。 - 多个线程几乎同时触发事件 → 时间戳相同。 - 线程间切换造成事件顺序混乱或局部堆积 → 表现为“跳变”。 --- ### 4. **事件本身不是周期性触发** 如果这些 `take`, `produce`, `pack` 是基于外部输入(如网络包、用户请求),那么它们的发生时间取决于据到达时机,而非固定间隔。因此时间戳自然会有波动甚至突变。 > 如:一段时间无操作,突然来了一大波请求 → 时间戳从 411942 直接跳到 411948。 --- ### 5. **时钟源精度问题** 某些系统使用的时钟分辨率较低(如毫秒级),当大量事件在短时间内发生时,前几个事件和后几个事件可能因时钟未更新而显示为同一时间戳;一旦跨过一个单位,就表现为“跳变”。 --- ### 结合你提供的日志分析: ``` take : 411941 (连续8次) ... take : 411942 (连续4次) produce : 411942 ... take : 411944 (非常密集,多次重复) ``` 说明: - 在 `411944` 这个时间点集中处理了大量事件。 - 中间没有 `411943` 的 `take`,但有 `produce` 和 `pack`,可能是该时刻没有消费动作。 - 并非每一步都严格递增,是因为事件驱动而非定时驱动。 ✅ 所以,“跳变”不是错误,而是反映了**真实负载分布 + 系统调度 + 并发行为**的结果。 --- ### 建议排查方式: 1. 使用更高精度的时间戳(如纳秒)查看是否真的跳变。 2. 添加线程 ID 或协程 ID 标识来源,判断是否多线程竞争。 3. 检查事件触发机制:是定时器?还是消息驱动? 4. 使用同步日志输出避免乱序。 ```python import time # 高精度打点示例 def log_with_timestamp(msg): ts = int(time.time() * 1000) # 毫秒级时间戳 print(f"[{ts}] {msg}") ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值