博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu Inverting Cups
阅读量:7029 次
发布时间:2019-06-28

本文共 1558 字,大约阅读时间需要 5 分钟。

这题需要分类讨论:

第一种情况:

n为奇数m为偶数的情况无解,因为m为偶数,每次翻转将把从正面翻到反面的个数x减去从反面翻到正面的个数y,得到的数必定为偶数。因为x+y为偶数,x-y也为偶数。而总个数为奇数,所以无解。

第二种情况:

n能整除m显然直接输出n/m。

第三种情况:

n,m同奇偶,且3*m>n的时候,可以3次解决:

1.将m个正的变成反的,则此时正的有n-m个,反的有m个。

2.将(n-m)/2个正的翻成反的,将(3m-n)/2个反的翻成正的,此时正的有n-m-(n-m)/2+(3m-n)/2=m,反的有m+(n-m)/2-(3m-n)/2=n-m

3.将剩下m个正的翻成反的。

因为n,m同奇偶,所以(n-m)/2和(3m-n)/2必定为整数。

第四种情况:

如果n>3*m的话先每次将m个正的翻成反的,一直翻到剩下p个正的有3*m>p时再用上述方法翻。

当n为偶数,m为奇数,且3*m>n>2*m的时候,可以四步解决:

1.先将m个正的翻成反的,此时有n-m个正的,m个反的。

2.将(n-m-1)/2个正的翻成反的,将(3m-n+1)/2个反的翻成正的,则此时有m+1个正的,n-m-1个反的。

3.将(m+1)/2个正的硬币翻成反的,将(m-1)/2个反的硬币翻成正的,此时有m个正的,n-m个反的。

4.将剩下所有的正的翻过来。 

第一次必须把m个正的翻成反的,最后一次必须把m个反的翻成正的,而对于m为奇数的情况,设把正面翻成反面的个数为x,反面翻成正面的个数为y,因为x+y=m为奇数,x-y也为奇数,所以必须经过偶数次翻转才能把杯子全部翻成反的,因此4次是最少的情况。

对于n>3*m显然也可以每次翻m个正的直到剩下p个正的,且有3*m>p的时候再用这种方法翻。

对于n<2*m的情况,翻转次数F(n,m)显然和F(n,n-m)相等,因为前面提到了,答案肯定是偶数,对于每两次翻转,(n,m)和F\(n,n-m)都能通过各自的方式得到同样的结果,因为每两次翻转将杯子翻转两遍的个数范围为[2m-n,m],也就是说这两次翻转只将[0,2(n-m)]的杯子翻转了一遍,而对于(n,n-m)的情况,翻转两次去掉重复翻转的,剩下的只翻转一次的杯子个数范围也是[0,2(n-m)],所以F(n,m)==F(n,n-m)。

每次只需要按照上面的方法判断一遍就可以给出结果了。

#include 
__int64 Solve(__int64 n,__int64 m) { if (n%m==0) return n/m; if (n%2==1 && m%2==0) return -1; if (n>=3*m) return (n/m-2)+Solve(n%m+2*m,m); if ((n%2)==(m%2)) return 3; if (n>=2*m) return 4; return Solve(n,n-m); } int main() { __int64 n,m,ret,q,r; while(scanf("%I64d%I64d",&n,&m)!=EOF) { ret=Solve(n,m); if (ret<0) printf("No Solution!\n"); else printf("%I64d\n",ret); } return 0; }
View Code

 

转载于:https://www.cnblogs.com/acm-jing/p/4358003.html

你可能感兴趣的文章
paper 34 :常见函数的举例(更新ing)2
查看>>
用requirejs使angularJS模块化开发
查看>>
Eclipse Maven工作空间中工程依赖调试的源码问题(转)
查看>>
MLP Coursework Machine Learning Practical
查看>>
html5 随机数函数
查看>>
: error C3861: “Sleep”: 找不到标识符
查看>>
蓝桥杯 字母组串(递归)
查看>>
【LeetCode 231_整数_位运算】Power of Two
查看>>
解决小BUG的罗列
查看>>
软工15个人作业3
查看>>
JavaScript DOM 编程艺术(第2版)读书笔记 (9)
查看>>
hadoop综合大作业
查看>>
How Tomcat works — 八、tomcat中的session管理
查看>>
leetcode — n-queens
查看>>
Http协议
查看>>
亡命逃窜---三维搜索
查看>>
压力测试的轻量级具体做法
查看>>
约束用起来
查看>>
Javascript加速运动与减速运动
查看>>
HTTP学习
查看>>