FZU2147 A-B Game(贪心)
2014-11-18 16:33
176 查看
题意
输入A、B(B<A)。A每次可以进行一次变换:A = A - (A % x) ,其中1≤x≤A-1。问最少经过多少次变换,A的值小于等于B。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
分析
如果A%x的最大值与A成正比,那么这就是一道贪心题,每步都取让A%x值为最大的x即可。即每一步都让A减去尽可能大的值是这道题的解题思路。
现在分析A%x的性质,最优解x(让A减去的值最大),其实就是比A的一半更大一点点的整数,即
![](http://latex.codecogs.com/gif.latex?%7Bx%5E*%7D%20=%20%5Cleft%5Clfloor%20%7B%5Cfrac%7BA%7D%7B2%7D%7D%20%5Cright%5Crfloor%20+%201)
(以下我的证明方法仅供参考,关键是读者自己想明白其中的道理。)
为什么呢?如下图中的彩色线段,我们把数A理解成长度为A的线段。比中点稍大的整数就是图中绿色的点,余数相当于绿点右边红色线段的长度,长度为
![](http://latex.codecogs.com/gif.latex?A%20-%20%7Bx%5E*%7D)
。
如果取绿点右边的某个整数点y,则余数是点y至终点的线段长度,显然会比原来的短。
如果取绿点左边的某个整数点z。那么有两种情况:
一种是中点存在,如图中的黄点,此时A%z为0,必然不是最优解。
另一种情况是z为中点左边的某个点(图中的灰点),则必然有
![](http://latex.codecogs.com/gif.latex?z%20%5Cle%20A%20%5C%25%20%7Bx%5E*%7D)
(想一想为什么),又
![](http://latex.codecogs.com/gif.latex?A%5C%25%20z%20%3C%20z)
,所以
![](http://latex.codecogs.com/gif.latex?A%5C%25%20z%20%3C%20A%20%5C%25%20%7Bx%5E*%7D)
。
![](https://img-blog.csdn.net/20141117223044671?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZTQxMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
再简单的分析,知公式中的
![](http://latex.codecogs.com/gif.latex?x%5E*)
实际就是变化后A的值,故代码很简单:
输入A、B(B<A)。A每次可以进行一次变换:A = A - (A % x) ,其中1≤x≤A-1。问最少经过多少次变换,A的值小于等于B。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
分析
如果A%x的最大值与A成正比,那么这就是一道贪心题,每步都取让A%x值为最大的x即可。即每一步都让A减去尽可能大的值是这道题的解题思路。
现在分析A%x的性质,最优解x(让A减去的值最大),其实就是比A的一半更大一点点的整数,即
(以下我的证明方法仅供参考,关键是读者自己想明白其中的道理。)
为什么呢?如下图中的彩色线段,我们把数A理解成长度为A的线段。比中点稍大的整数就是图中绿色的点,余数相当于绿点右边红色线段的长度,长度为
。
如果取绿点右边的某个整数点y,则余数是点y至终点的线段长度,显然会比原来的短。
如果取绿点左边的某个整数点z。那么有两种情况:
一种是中点存在,如图中的黄点,此时A%z为0,必然不是最优解。
另一种情况是z为中点左边的某个点(图中的灰点),则必然有
(想一想为什么),又
,所以
。
再简单的分析,知公式中的
实际就是变化后A的值,故代码很简单:
#include <cstdio> #include <iostream> using namespace std; typedef long long LL; int main() { int T; scanf("%d", &T); for (int kase = 1; kase <= T; kase++) { printf("Case %d: ", kase); LL a, b, cnt = 0; cin >> a >> b; while (a > b) { a = a/2 + 1; cnt++; } printf("%d\n", cnt); } return 0; }
相关文章推荐
- FZU 2147 A-B Game
- 【瞎搞】 FZU 2147 A-B Game
- FZU - 2147 A-B Game(找规律)
- FZU 2147 A-B Game
- FZU 2147 A-B Game
- FZU_2147_A-B_GAME
- FZU OJ 2147 A-B Game (数学水题)
- FZU-2147-2147 A-B Game,规律题。。
- FZU-Problem 2147 A-B Game
- fzu 2146 Easy Game & 2147 A-B Game & 2151 OOXX Game(水题)
- FZU 2147 A-B Game
- FZU 2147 A-B Game(数学推导题)
- FZU 2147 A-B Game
- fzu 2111 Min Number(贪心)
- Fire Game FZU - 2150
- hdu6237-2017哈尔滨CCPC-质因子&贪心&暴力-A Simple Stone Game
- FZU 2203 单纵大法好 (二分+贪心)
- FZU 2144(几何+贪心区间覆盖)
- HDU 5090 Game with Pearls (贪心)
- leetcode+jumpgame+贪心,找出最大的maxIndex