• F - 爱丽丝、鲍勃和巧克力


    【题目描述】

    他们把n个巧克力棒排成一行。爱丽丝开始从左到右一个接一个地吃巧克力棒,鲍勃——从右到左。对于每个巧克力棒,玩家食用它所需的时间是已知的(爱丽丝和鲍勃以相同的速度吃掉它们)。当玩家吃掉一块巧克力时,他会立即从另一块开始。不允许同时吃两块巧克力,不要让巧克力棒未吃完并暂停。如果两个玩家开始同时吃同一个酒吧,鲍勃把它留给爱丽丝作为一个真正的绅士。

    【输入】

    第一行包含一个整数 n (1 ≤ n ≤ 10 5) — 表格上的柱数。第二行包含一个序列 t 1, t 2, ..., tn (1 ≤ t i ≤ 1000),其中 t i 是消耗第 i 根柱所需的时间(以秒为单位)(按从左到右的顺序)。

    【输出】

    打印两个数字 a 和 b,其中 a 是 Alice 消耗的柱线数量,b 是 Bob 消耗的柱线数量。

    解题思路

    将right,left分别代表爱丽丝所在的位置和鲍勃所在的位置。

    如果最后剩下一块巧克力,并且两人同时吃完当前的巧克力(sum1==sum2),这种情况将巧克力给爱丽丝,将right++后结束循环

    循环过程中:当sum1==sum2时,先让爱丽丝分得下一块巧克力,接着判断是否存在巧克力,存在的话让鲍勃分得下一块巧克力。sum1>sum2时,让鲍勃分得下一块巧克力,sum1

    代码如下

    1. #include<stdio.h>
    2. int a[100005];
    3. int main() {
    4. int n;
    5. scanf("%d", &n);
    6. for (int i = 1; i <= n; i++) {
    7. scanf("%d", &a[i]);
    8. }
    9. int right = 0, left = n+1;
    10. int sum1 = 0, sum2 = 0;
    11. //循环结束条件是right>=left
    12. while(right<left){
    13. //当所有的巧克力被分完的时候,结束循环
    14. if (left - right == 1 ) {
    15. break;
    16. }
    17. //如果最后剩下一块巧克力,并且两人同时吃完当前的巧克力(sum1==sum2
    18. //题目要求,这种情况将巧克力给爱丽丝,将right++后结束循环
    19. if (left - right == 2 && sum1 == sum2) {
    20. right++;
    21. break;
    22. }
    23. //sum1==sum2时,先让爱丽丝分得下一块巧克力
    24. //接着判断是否存在巧克力,存在的话让鲍勃分得下一块巧克力
    25. if (sum1 == sum2) {
    26. right++;
    27. sum1 = sum1 + a[right];
    28. if(right<left){
    29. left--;
    30. sum2 = sum2 + a[left];
    31. }
    32. }
    33. else if (sum1 > sum2) {
    34. left--;
    35. sum2 = sum2 + a[left];
    36. }
    37. else if (sum1 < sum2) {
    38. right++;
    39. sum1 = sum1 + a[right];
    40. }
    41. }
    42. printf("%d %d", right, n - left + 1);
    43. }

  • 相关阅读:
    基于函数计算FC3.0 部署AI数字绘画stable-diffusion自定义模型
    目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调用库示例
    ♥Redis教程 - Redis知识体系详解♥
    毕业了校园卡怎么改套餐?
    注册商标流程,商标注册需要材料
    SpringCloud Alibaba Sentinel 限流详解
    排查服务器异常流量保姆级教程
    操作系统——第一章概论(下)
    js回到顶部或定位到指定元素
    cms之wordpress主题安装
  • 原文地址:https://blog.csdn.net/m0_73172034/article/details/131112263