• 最小步数


    小楠正在玩一个游戏,规则为:

    从起点到终点有 n 步,如果走第 k 步,小楠将会得到 a[k] 元钱,a[k] 可能为负数。小楠也可以花 100 元钱跳过当前的这一步,即不会得到 a[k] 。但是任何时刻身上的钱都必须是非负的。

    开始时,小楠身上共有 0 元。给定数组 a ,求在能到达终点的情况下最少需要走过(即不是用100 元钱跳过)的步数。

    90pts priority_queue

    1. #include
    2. using namespace std;
    3. #define int long long
    4. int n,a[1010],ans,money;
    5. bool flag=1;
    6. priority_queue<int>q;
    7. signed main()
    8. {
    9. freopen("steps.in","r",stdin);
    10. freopen("steps.out","w",stdout);
    11. scanf("%lld",&n);
    12. for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    13. for(int i=1;i<=n;i++)
    14. {
    15. if(a[i]+100<=0)
    16. {
    17. money-=100;
    18. if(money>=100) ans+=1;
    19. else
    20. {
    21. ans++;
    22. while(money<0)
    23. {
    24. if(q.empty()) break;
    25. money+=100+q.top();
    26. q.pop();
    27. ans--;
    28. }
    29. if(money<0)
    30. {
    31. puts("-1");
    32. flag=0;break;
    33. }
    34. }
    35. }
    36. else
    37. {
    38. if(a[i]<0)
    39. {
    40. if(money>=100)
    41. {
    42. money-=100;
    43. q.push(a[i]);
    44. ans++;
    45. }
    46. else
    47. {
    48. money+=a[i];
    49. if(money<0)
    50. {
    51. while(money<0)
    52. {
    53. if(q.empty()) break;
    54. money+=100+q.top();
    55. q.pop();
    56. ans--;
    57. }
    58. if(money<0)
    59. {
    60. puts("-1");
    61. flag=0;break;
    62. }
    63. }
    64. }
    65. }
    66. else
    67. {
    68. if(money>=100)
    69. {
    70. money-=100;
    71. q.push(a[i]);
    72. ans++;
    73. }
    74. else money+=a[i];
    75. }
    76. }
    77. }
    78. if(flag) printf("%lld",n-ans);
    79. return 0;
    80. }

    AC DP:
    注意17 19 22 行,其中17 19要考虑到有可能结果money为正,但是过程money为负,所以有第一个条件,22行是要注意for(int j=1;j

    1. #include
    2. using namespace std;
    3. #define int long long
    4. int n,a[1010],f[210][210];
    5. signed main()
    6. {
    7. freopen("steps.in","r",stdin);
    8. freopen("steps.out","w",stdout);
    9. scanf("%lld",&n);
    10. for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    11. memset(f,-0x3f3f3f3f,sizeof f);
    12. for(int i=0;i<=n;i++) f[0][i]=0;
    13. for(int i=1;i<=n;i++)
    14. {
    15. for(int j=1;j
    16. {
    17. if(f[i-1][j-1]>=0&&f[i-1][j-1]+a[i]>=0)
    18. f[i][j]=max(f[i][j],f[i-1][j-1]+a[i]);
    19. if(f[i-1][j]>=100&&f[i-1][j]>=0)
    20. f[i][j]=max(f[i][j],f[i-1][j]-100);
    21. }
    22. if(f[i-1][i-1]+a[i]>=0&&f[i-1][i-1]>=0)
    23. f[i][i]=f[i-1][i-1]+a[i];
    24. }
    25. for(int i=1;i<=n;i++)
    26. {
    27. if(f[n][i]>=0)
    28. {
    29. printf("%lld\n",i);
    30. return 0;
    31. }
    32. }
    33. puts("-1");
    34. return 0;
    35. }

  • 相关阅读:
    认识JAVA中的异常
    Hugging Face 分词器新增聊天模板属性
    深入探索Transformer时代下的NLP革新
    基于imx6ul下调试tlv320aic3x声卡
    Spinner
    一篇博客学会系列(2)—— C语言中的自定义类型 :结构体、位段、枚举、联合体
    C++零碎记录(十三)
    PRA捕获控件没有反应
    Kafka:C++ 实践
    暑假超越计划练习题(6)
  • 原文地址:https://blog.csdn.net/m0_60137414/article/details/126696158