我是最摆的 2024-03-07 21:23 采纳率: 0%
浏览 9

最大数字怎么解123456789

最大数字题解好难理解https://www.lanqiao.cn/problems/2193/learning/


#include <bits/stdc++.h>
using namespace std;
int T[15],D[15],L[15];
int n;
int vis[15],ans;
void dfs(int plane,int time){
    if(plane==n){       //n架飞机都安排好了能降落
        ans=1;
        return;
    }
    for(int i=0;i<n;i++){
        if(!vis[i] && time<=T[i]+D[i]){  //剪枝
            int t = time;                //t:安排给飞机i的降落时间
            if(t<T[i])  t=T[i];          //飞机i还没到,只能等它
            vis[i]=1;                   
            dfs(plane+1,t+L[i]);
            vis[i]=0;
        }
    }
}
int main(){
    int m; cin >>m;  //m是测试组数
    while(m--){
        cin >> n;
        for(int i=0;i<n;++i)  cin >> T[i] >> D[i] >> L[i];
        ans = 0;
        dfs(0,0);
        if(ans) cout<<"YES\n";
        else    cout<<"NO\n";
    }
    return 0;
}

给的代码是不是有问题?T_T

测试用例 123 1 2 表示初始的字符串数字是 123,第一种操作剩余次数为 1,第二种操作剩余次数为 2。

递推过程如下:

起始状态:

字符串 s: "123"
操作1剩余次数 A: 1
操作2剩余次数 B: 2
当前位 i: 0(从最高位开始)
当前累积值 v: 0
第1步:处理最高位('1')
第1位数字 d: 1
第1种操作次数 t: min(1, 9-1) = 1(因为只能操作一次)
更新 A: 1 - 1 = 0
递归调用 dfs(1, 010 + 1 + 1): 处理下一位,当前累积值为 2
恢复 A: 0 + 1 = 1
检查操作2:因为 B > d,执行操作2
更新 B: 2 - (1 + 1) = 0
递归调用 dfs(1, 0
10 + 9): 处理下一位,当前累积值为 9
恢复 B: 0 + (1 + 1) = 2
第2步:处理第二位('2')
(从第一个递归调用返回,此时累积值为2,处理下一位 '2')

第2位数字 d: 2
第1种操作次数 t: min(0, 9-2) = 0(因为已经没有操作1的次数了)
直接递归调用 dfs(2, 2*10 + 2): 处理下一位,当前累积值为 22
(从第二个递归调用返回,此时累积值为9,处理下一位 '2')

第2位数字 d: 2
第1种操作次数 t: min(1, 9-2) = 1(因为还有1次操作1的次数)
更新 A: 1 - 1 = 0
递归调用 dfs(2, 910 + 2 + 1): 处理下一位,当前累积值为 93
恢复 A: 0 + 1 = 1
检查操作2:因为 B > d,执行操作2
更新 B: 2 - (2 + 1) = -1(这里 B 已经为负数,但代码中没有做这样的检查)
递归调用 dfs(2, 9
10 + 9): 处理下一位,当前累积值为 99
恢复 B: -1 + (2 + 1) = 2
第3步:处理第三位('3')
(从第一个递归调用返回,此时累积值为22,处理下一位 '3')

第3位数字 d: 3
第1种操作次数 t: min(0, 9-3) = 0(已经没有操作1的次数了)
直接递归调用 dfs(3, 22*10 + 3): 处理下一位,但字符串结束,所以直接更新答案
(从第二个递归调用返回,此时累积值为93,处理下一位 '3')

第3位数字 d: 3
第1种操作次数 t: min(0, 9-3) = 0(已经没有操作1的次数了)
直接递归调用 dfs(3, 93*10 + 3): 处理下一位,但字符串结束,所以直接更新答案
(从第三个递归调用返回,此时累积值为99,处理下一位 '3')

第3位数字 d: 3
第1种操作次数 t: min(0, 9-3) = 0(已经没有操作1的次数了)
直接递归调用 dfs(3, 99*10 + 3): 处理下一位,但字符串结束,所以直接更新答案,

?所以谁知道到底怎么推啊,太难理解了T_T

  • 写回答

2条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-03-07 21:34
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    这是一道递归题,目的是判断在一定次数内是否能通过两种操作将一个数字字符串变成全由相同数字构成的字符串。 具体思路是对每一位数字进行两次操作: 1.将该位数字替换成其它数字,操作次数有限制; 2.将该位数字重复多次,操作次数有限制。 对于每一位数字,都先进行操作2,然后再进行操作1。在递归时,从最高位开始处理,累积已操作的次数和当前数字,如果到达字符串末尾时累积数字相同,则输出 YES。 其中需要注意以下几点: 1.操作1的限制是在本位数字 + 1 ~ 9 中选择数字,而不是本位数字 + 1 ~ 10; 2.每次处理一位数字时,需要分别对剩余的操作次数进行处理,而不是一直将操作1的次数传递下去; 3.在执行操作2的时候,需要判断剩余的次数是否大于等于当前位数字,否则操作将无法进行,递归时需要跳过当前位。 以下是代码实现:
    评论

报告相同问题?

问题事件

  • 创建了问题 3月7日

悬赏问题

  • ¥15 孟德尔随机化结果不一致
  • ¥15 深度学习残差模块模型
  • ¥50 怎么判断同步时序逻辑电路和异步时序逻辑电路
  • ¥15 差动电流二次谐波的含量Matlab计算
  • ¥15 Can/caned 总线错误问题,错误显示控制器要发1,结果总线检测到0
  • ¥15 C#如何调用串口数据
  • ¥15 MATLAB与单片机串口通信
  • ¥15 L76k模块的GPS的使用
  • ¥15 请帮我看一看数电项目如何设计
  • ¥23 (标签-bug|关键词-密码错误加密)