题目信息

题目类型
提高级
题目年份
2022
题目题型
综合题
关 键 词
容器分水

题目题干

第 20 题

(2)(容器分水) 有两个容器,容器 1 的容量为为 a 升,容器 2 的容量为 b 升;同时允许下列的三种操作,分别为:Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

  1. FILL(i):用水龙头将容器 i(i \in {1,2})i(i∈1,2) 灌满水;
  2. DROP(i):将容器 i 的水倒进下水道;
  3. POUR(i,j):将容器 i 的水倒进容器 j(完成此操作后,要么容器 j 被灌满,要么容器 i 被清空)。

求只使用上述的两个容器和三种操作,获得恰好 c 升水的最少操作数和操作序列。上述 a、b、c 均为不超过 100 的正整数,且 c≤max{a,b}。Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

试补全程序。
  1. #include <bits/stdc++.h> 
  2. using namespace std; 
  3. const int N = 110; 
  4.  
  5. int f[N][N]; 
  6. int ans; 
  7. int a, b, c; 
  8. int init; 
  9.  
  10. int dfs(int x, int y) { 
  11.     if (f[x][y] != init) 
  12.         return f[x][y]; 
  13.     if (x == c || y == c) 
  14.         return f[x][y] = 0; 
  15.     f[x][y] = init - 1; 
  16.     f[x][y] = min(f[x][y], dfs(a, y) + 1); 
  17.     f[x][y] = min(f[x][y], dfs(x, b) + 1); 
  18.     f[x][y] = min(f[x][y], dfs(0, y) + 1); 
  19.     f[x][y] = min(f[x][y], dfs(x, 0) + 1); 
  20.     int t = min(a - x, y); 
  21.     f[x][y] = min(f[x][y], ①); 
  22.     t = min(x, b - y); 
  23.     f[x][y] = min(f[x][y], ②); 
  24.     return f[x][y]; 
  25.  
  26. void go(int x, int y) { 
  27.     if (③) 
  28.         return
  29.     if (f[x][y] == dfs(a, y) + 1) { 
  30.         cout << "FILL(1)" << endl; 
  31.         go(a, y); 
  32.     } else if (f[x][y] == dfs(x, b) + 1) { 
  33.         cout << "FILL(2)" << endl; 
  34.         go(x, b); 
  35.     } else if (f[x][y] == dfs(0, y) + 1) { 
  36.         cout << "DROP(1)" << endl; 
  37.         go (0, y); 
  38.     } else if (f[x][y] == dfs(x, 0) + 1) { 
  39.         cout << "DROP(2)" << endl; 
  40.         go(x, 0); 
  41.     } else { 
  42.         int t = min(a - x, y); 
  43.         if(f[x][y] == ④) { 
  44.             cout << "POUR(2,1)" << endl; 
  45.             go(x + t, y - t); 
  46.         } else { 
  47.             t = min(x, b - y); 
  48.             if (f[x][y] == ⑤) { 
  49.                 cout << "POUR(1,2)" << endl; 
  50.                 go(x - t, y + t); 
  51.             } else 
  52.                 assert(0); 
  53.         } 
  54.     } 
  55.  
  56. int main() { 
  57.     cin >> a >> b >> c; 
  58.     ans = 1 << 30; 
  59.     memset(f, 127, sizeof f); 
  60.     init = **f; 
  61.     if ((ans = dfs (0, 0)) == init - 1) 
  62.         cout << "impossible"
  63.     else { 
  64.         cout << ans << endl; 
  65.         go (0, 0); 
  66.     } 
Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
①~⑤处应填( )Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
1.Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 A. dfs(x + t, y - t) + 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 B. dfs(x + t, y - t) - 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 C. dfs(x - t, y + t) + 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 D. dfs(x - t, y + t) - 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
2.Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 A. dfs(x + t, y - t) + 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 B. dfs(x + t, y - t) - 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 C. dfs(x - t, y + t) + 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 D. dfs(x - t, y + t) - 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
3.Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 A. x == c || y == cKk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 B. x == c && y == cKk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 C. x >= c || y >= cKk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 D. x >= c && y >= cKk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
4.Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 A. dfs(x + t, y - t) + 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 B. dfs(x + t, y - t) - 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 C. dfs(x - t, y + t) + 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 D. dfs(x - t, y + t) - 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
5.Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 A. dfs(x + t, y - t) + 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 B. dfs(x + t, y - t) - 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 C. dfs(x - t, y + t) + 1Kk7100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 D. dfs(x - t, y + t) - 1

答案解析

相关题目

第 20 题 (2)(容器分水) 有两个容器,容器 1 的容量为为 a 升,容器 2 的容量为 b 升;同时允许下列的三种操作,分别为: FILL(i):用水龙头将容器 i(i \in {1,2}
第 19 题 (1)(归并第 k 小) 已知两个长度均为 n 的有序数组 a1 和 a2(均为递增序,但不保证严 格单调递增),并且给定正整数 k(1≤k≤2n),求数组 a1 和 a2 归并排序后的
第 18 题 (3) #include <iostream>   #include <algorithm>     using namespace std;     cons
第 17 题 (2) #include <iostream>     using namespace std;     const int MAXN = 105;     int n, m
第 16 题 (1) #include <iostream>   #include <string>   #include <vector>      using 
第 15 题 ack 函数在输入参数“(2,2)”时的返回值为()。 unsigned ack(unsigned m, unsigned n) {      if (m == 0) return 
第 14 题 以比较为基本运算,在 n 个数的数组中找最大的数,在最坏情况下至少要做( )次运算。 A.n/2 B.n-1 C.n D.n+1
第 13 题 对于给定的 n,分析以下代码段对应的时间复杂度,其中最为准确的时间复杂度为( )。 int i, j, k = 0; for (i = 0; i < n; i++) { f
第 12 题 给定地址区间为 0~9 的哈希表,哈希函数为 h(x) = x % 10,采用线性探查的冲突解决策略(对于出现冲突情况,会往后探查第一个空的地址存储;若地址 9 冲突了则从地址 0 重新
第 11 题 小明希望选到形如“省 A·LLDDD ”的车牌号。车牌号在“·”之前的内容固定的 5 位号码中,前 2 位必须是大写英文字母,后 3 位必须是阿拉伯数字(L代表 A 至 Z,D 表示

提示声明

  • 免责声明:本站资源均来自网络或者用户投稿,仅供用于学习和交流:如有侵权联系删除!
  • 温馨提示:本文属于积分文章,需要充值获得积分或升级VIP会员,也可在会员中心投稿获取。

猜你喜欢