鱼C论坛

 找回密码
 立即注册
查看: 1529|回复: 0

[技术交流] PTA A_1044 Shopping in Mars

[复制链接]
发表于 2020-1-28 13:09:29 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 798236606 于 2020-1-28 13:12 编辑

题目连接:https://pintia.cn/problem-sets/994805342720868352/problems/994805439202443264

解:
1.暴力枚举, 会有2组数据超时
  1. #include <stdio.h>
  2. #include <limits.h>

  3. int dia[100010];
  4. int min = INT_MAX;

  5. int exact_pay(int n, int price)
  6. {
  7.         int i, j, total, flag = 1;
  8.         
  9.         for (i = 1; i <= n; i++)
  10.         {
  11.                 for (total = dia[j = i]; j <= n; total += dia[++j])
  12.                 {
  13.                         if (total == price)
  14.                         {
  15.                                 printf("%d-%d\n", i, j);
  16.                                 
  17.                                 flag = 0;
  18.                                 break;
  19.                         }
  20.                         
  21.                         if (total > price)
  22.                         {
  23.                                 if (total < min)
  24.                                         min = total;

  25.                                 break;
  26.                         }
  27.                 }
  28.         }
  29.         
  30.         return flag;
  31. }

  32. void min_pay(int n, int price)
  33. {
  34.         int i, j, total;
  35.         
  36.         for (i = 1; i <= n; i++)
  37.         {
  38.                 for (total = dia[j = i]; j <= n; total += dia[++j])
  39.                 {
  40.                         if (total == min)
  41.                         {
  42.                                 printf("%d-%d\n", i, j);
  43.                                 break;
  44.                         }
  45.                 }
  46.         }
  47. }

  48. int main(void)
  49. {
  50.         int n, price, i;
  51.         
  52.         scanf("%d %d", &n, &price);
  53.         
  54.         for (i = 1; i <= n; i++)
  55.                 scanf("%d", dia + i);
  56.                
  57.         if (exact_pay(n, price))
  58.                 min_pay(n, price);

  59.         return 0;
  60. }
复制代码

2.采用二分法
  1. #include <stdio.h>
  2. #include <limits.h>

  3. int dia[100010] = {0};
  4. int min = INT_MAX;

  5. int binary_search(int left, int right, int price)
  6. {
  7.         int i = left, mid, sum;
  8.         
  9.         while (left < right)
  10.         {
  11.                 mid = (right + left) / 2;
  12.                 sum = dia[mid] - dia[i - 1];//i~j的和 = dia[j] - dia[i - 1]

  13.                 if (sum >= price)
  14.                         right = mid;
  15.                 else
  16.                         left = mid + 1;
  17.         }
  18.         
  19.         return left;
  20. }

  21. int exact_pay(int n, int price)
  22. {
  23.         int i, j, sum, flag = 1;
  24.    
  25.         for (i = 1; i <= n; i++)
  26.         {
  27.                 j = binary_search(i, n, price);
  28.                 sum = dia[j] - dia[i - 1];
  29.                
  30.                 if (sum == price)
  31.                 {
  32.                         printf("%d-%d\n", i, j);
  33.                         flag = 0;
  34.                 }

  35.                 if (sum < min && sum > price)
  36.                         min = sum;                        
  37.         }
  38.    
  39.         return flag;
  40. }

  41. void min_pay(int n)
  42. {
  43.         int i, j, sum;
  44.    
  45.         for (i = 1; i <= n; i++)
  46.         {
  47.                 j = binary_search(i, n, min);
  48.                 sum = dia[j] - dia[i - 1];
  49.                
  50.                 if (sum == min)
  51.                         printf("%d-%d\n", i, j);
  52.         }
  53. }


  54. int main(void)
  55. {
  56.         int n, price, i;
  57.         
  58.         scanf("%d %d", &n, &price);
  59.         
  60.         for (i = 1; i <= n; i++)
  61.                 scanf("%d", dia + i);
  62.                
  63.         //计算和值        令dia[i] = dia[1]~dia[i]的和
  64.         for (i = 2; i <= n; i++)
  65.                 dia[i] += dia[i - 1];

  66.         if (exact_pay(n, price))
  67.                 min_pay(n);        

  68.         return 0;
  69. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-2 12:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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