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

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

题意是给出A个杯子,一开始都朝上,每次可以翻B个杯子,问最少需要翻转多少次可以让所有杯子都朝下。

分类讨论:

首先对于A%B==0一类情况,直接输出。

对于A>=3B,让A减到[2B,3B)区间内,翻转次数累加上A/B-2。

当A>=2B时,分奇偶讨论:A为奇数B为偶数显然无解;AB同奇偶时最多需要3次,A偶数B奇数最多需要4次。

当A<2B时,分奇偶讨论:AB同奇偶时最多需要3次,A奇数B偶数无解,A偶数B奇数时,有F(A,B)=F(A,A-B)成立,可以转换成上面的情况求解即可。

具体证明画画图就知道了,将两个B分别放到对称的位置上,想办法调整使得每次改变自己需要的杯子就行。对于A偶B奇的F(A,B)=F(A,A-B),其实挺好想的,因为A是偶数,B是奇数,而每个杯子一共翻转了奇数次,而一共一定是要翻转偶数轮,因此每个杯子不翻转的次数也是奇数次,也就相当于对“翻转”操作“取反”,每次翻转A-B个,结果是一样的,因此F(A,B)=F(A,A-B)成立。

 

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 500000111 using namespace std;12 ll solve(ll n,ll m)13 {14 if(n%m==0) return n/m;15 if(n%2==1&&m%2==0) return -1;16 if(n>=3*m) return n/m-2+solve(n%m+2*m,m);17 if(n%2==m%2) return 3;18 if(n>=2*m) return 4;19 return solve(n,n-m);20 }21 int main(){22 ll n,m;23 while(cin>>n>>m){24 ll ans=solve(n,m);25 if(ans<0) cout<<"No Solution!"<
View Code

 

 

 

转载于:https://www.cnblogs.com/xin-hua/p/3240043.html

你可能感兴趣的文章
mysql忘记密码的解决办法
查看>>
全面分析Java的垃圾回收机制2
查看>>
[Code Festival 2017 qual A] C: Palindromic Matrix
查看>>
修改博客园css样式
查看>>
Python3 高阶函数
查看>>
初始面向对象
查看>>
docker一键安装
查看>>
leetcode Letter Combinations of a Phone Number
查看>>
ALS算法 (面试准备)
查看>>
Unity 5.4 测试版本新特性---因吹丝停
查看>>
7.5 文件操作
查看>>
DFS-hdu-2821-Pusher
查看>>
MyEclipse中将普通Java项目convert(转化)为Maven项目
查看>>
node js 安装.node-gyp/8.9.4 权限 无法访问
查看>>
Linux内核分析——第二周学习笔记
查看>>
windows基本命令
查看>>
Qt图片显示效率的比较(转)
查看>>
VMware中CentOS设置静态IP
查看>>
剑指Offer_编程题_7
查看>>
js 变量大小写
查看>>