03_Casework 案例分析
title: 03_Casework 案例分析categories: 01_Bronzetags:03_Casework 案例分析什么是案例分析案例分析Casework是一种通过分情况讨论来解决问题的算法思想。当问题存在多种不同的情况且每种情况需要不同的处理方式时这种方法特别有效。案例分析的特点分情况讨论将问题分成若干种情况分别处理逻辑清晰每种情况独立分析避免复杂公式用简单逻辑处理边界情况需要仔细分析确保覆盖所有可能的情况适用场景问题有多种边界情况不同输入范围需要不同处理存在特殊情况需要单独考虑几何问题中需要分类讨论常见错误遗漏某些情况情况之间有重叠未处理好边界条件处理不当题目列表#题目难度01Sleepy Cow Herding⭐⭐⭐02Fence Painting⭐⭐03Three Logos⭐⭐⭐经典例题01. Sleepy Cow Herding (USACO Bronze)题目描述三头牛站在数轴上编号为 a b c。每次可以将一头牛移动到任意位置求最少需要多少次移动才能使三头牛相邻最多需要多少次移动才能使三头牛相邻算法思路案例分析最少移动次数 (min_ans)如果已经相邻 (c a 2)答案为 0如果存在间隙等于 2 (c b 2 或 b a 2)答案为 1否则答案为 2最多移动次数 (max_ans)计算最大间隙减 1max(b - a, c - b) - 1代码实现importsys sys.stdinopen(herding.in,r)sys.stdoutopen(herding.out,w)a,b,cmap(int,input().split())# 最少移动次数ifca2:min_ans0elifcb2orba2:min_ans1else:min_ans2# 最多移动次数max_dismax(b-a,c-b)max_ansmax_dis-1print(min_ans)print(max_ans)正确性分析三头牛相邻意味着它们占据三个连续的位置已经相邻时不需要移动间隙为 2 时只需移动中间的一头牛填补空位其他情况需要移动两次02. Fence Painting (USACO Bronze)题目描述给定两段需要粉刷的栅栏区间 [a, b] 和 [c, d]求粉刷完这两段栅栏后被粉刷的栅栏总长度。算法思路案例分析分情况讨论两段区间的重叠关系不相交b c或d a总长度为两段之和相交取并集长度包含一段完全包含另一段代码实现importsys sys.stdinopen(paint.in,r)sys.stdoutopen(paint.out,w)a,bmap(int,input().split())c,dmap(int,input().split())# 保证 a cifac:a,cc,a b,dd,b# 分情况讨论ifbc:# 不相交ansb-ad-celse:ifdb:# [c, d] 被 [a, b] 包含ansb-aelse:# 相交ansd-aprint(ans)时间复杂度O(1)03. Three Logos (CF Problem)题目描述给定三个矩形的长和宽判断能否将这三个矩形拼成正方形。如果能输出正方形的边长和拼法。算法思路案例分析将每个矩形的长边设为 y短边设为 x检查是否存在某个 y 使得三个矩形的 x 之和等于 y如果满足条件输出结果关键观察正方形的边长 max(所有 y)正方形的面积 三个矩形面积之和代码实现n3arrlist(map(int,input().split()))# 提取长和宽xxarr[::2]# 短边yyarr[1::2]# 长边r0sum_xy0mk[False]*3# 统一长边方向foriinrange(n):ifxx[i]yy[i]:xx[i],yy[i]yy[i],xx[i]rmax(r,yy[i])sum_xyxx[i]*yy[i]# 检查是否能组成正方形ifr*r!sum_xy:print(-1)exit()print(r)Hr# 先放置长边等于 r 的矩形foriinrange(n):ifyy[i]r:H-xx[i]mk[i]Truechchr(ord(A)i)for_inrange(xx[i]):print(ch*r)# 放置剩余矩形for_inrange(H):line2printforiinrange(n):ifmk[i]:continuechchr(ord(A)i)countxx[i]ifyy[i]Helseyy[i]line2printch*countprint(line2print)正确性分析三个矩形的面积之和必须等于正方形面积正方形的边长必须是某个矩形的长边需要找到合适的放置顺序