题解-P2907[USACO08OPEN] Roads Around The Farm S
题面请见此处: 洛谷P2907
-
前言:
这是本蒟蒻的第一篇题解, 为什么某谷上有这么多人写过这道题的题解我还要再写一遍呢, 因为本蒟蒻没有找到一篇过程写得特别详细的题解, 大多数的题解对于这道题都是直接给出函数式, 导致本蒟蒻一开始懵了半天才推倒出来函数式以及递归的继续条件, 并且根据某个著名大犇建议的每个人都可以写博客来帮助自己的学习, 一是可以当成笔记总结归纳, 方便以后查看, 二是可以借助写博客梳理一下自己对于每到题目的思路 -
解题思路与过程:
首先根据题意, 我们不难知道\(n\)与\(k\)的关系为\(n>k\)(因为当\(n\leq k\)时没办法分出来符合题意的两组且两组相差\(k\), 由此可得递归函数的继续条件是当\(n>k\)时且\(n-k\)是2的倍数时(至于为什么是偶数一会儿解下去就会明白);
我们再分析一下题目以及题目给出的样例可以列出来一个二元一次方程组: \(\left\{\begin{matrix}x+y=n\\x-y=k\end{matrix}\right.\)(其中\(x\)为分解的第一组, \(y\)为分解的第二组),
接着对这个式子进行化简可得: \(2x=n+k, y=x-k\), 再化简: \(x=\frac{(n+k)}{2}, y=\frac{(n+k)}{2}-k=\frac{(n+k)-2k}{2}=\frac{(n-k)}{2}\),
这样就有递归的返回值了, 顺便说一下为什么\(n-k\)必须是偶数呢, 因为我们有刚才化简过后的式子: \(y=\frac{(n-k)}{2}\), 从这个式子得知, \(n-k\)必须是2的倍数(要不分组就分不成整数了, 不符合题意)
有了两个关系式\(x=\frac{(n+k)}{2}, y=\frac{(n-k)}{2}\)代码就很好实现了
点击查看代码
#include <iostream>
using namespace std;
int N, k;
int gp(int n){
if (n-k > 0 && (n-k)%2 == 0) return gp((n+k)/2) + gp ((n-k)/2);
else return 1;
}
int main(){
cin >> N >> k;
cout << gp(N);
return 0;
}
本人水平有限,本文主要用于记录个人学习过程,其中可能存在一些表述不严谨或理解不到位的地方
如有错误,欢迎各位指正qwq

浙公网安备 33010602011771号