这题需要分类讨论:

第一种情况:

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 <stdio.h>
__int64 Solve(__int64 n,__int64 m)
{
if (n%m==) return n/m;
if (n%== && m%==) return -;
if (n>=*m) return (n/m-)+Solve(n%m+*m,m);
if ((n%)==(m%)) return ;
if (n>=*m) return ;
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<) printf("No Solution!\n");
else printf("%I64d\n",ret);
}
return ;
}

hdu Inverting Cups的更多相关文章

  1. hdu 3859 Inverting Cups

    题意是给出A个杯子,一开始都朝上,每次可以翻B个杯子,问最少需要翻转多少次可以让所有杯子都朝下. 分类讨论: 首先对于A%B==0一类情况,直接输出. 对于A>=3B,让A减到[2B,3B)区间 ...

  2. hdu 5232 Shaking hands 水题

    Shaking hands Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  3. hdu 4112 Break the Chocolate 贪心

    Break the Chocolate Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem. ...

  4. hdu 5881 Tea (2016 acm 青岛网络赛)

    原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=5881 Tea Time Limit: 3000/1000 MS (Java/Others)    Me ...

  5. HDU 6667 Roundgod and Milk Tea (思维)

    2019 杭电多校 8 1011 题目链接:HDU 6667 比赛链接:2019 Multi-University Training Contest 8 Problem Description Rou ...

  6. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  8. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  9. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

随机推荐

  1. Android Intent不可传递大数据

    今天用intent传递一个bitmap,结果一直出错,intent无法执行,原来是intent不能传递大数据导致的,具体是多大,不太清楚,但我传递的bitmap在1m以上.

  2. Android 中SimpleDateFormat的使用注意

    以前在程序中总这样使用  SimpleDateFormat sdf=new SimpleDateFormat("hh:mma");   date1=sdf.parse(alertT ...

  3. July 16th, Week 29th Saturday, 2016

    A long road tests a horse's strength and a long task proves a man's heart. 路遥知马力,日久见人心. Do you have ...

  4. July 11th, Week 29th Monday, 2016

    I want to win a trophy, it's the most important. 我希望获得冠军奖杯,这是最重要的事情. Win a trophy, stand on the very ...

  5. opencv学习笔记(五)镜像对称

    opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...

  6. (十)stm32中FSMC的使用(用于LCD)

    FSMC全称“静态存储器控制器”. 使用FSMC控制器后,可以把FSMC提供的FSMC_A[25:0]作为地址线,而把FSMC提供的FSMC_D[15:0]作为数据总线. (1)当存储数据设为8位时, ...

  7. icon上添加数字提醒

    使用viewbadger包: package com.jingle.vierbagerstudy; import android.app.Activity; import android.os.Bun ...

  8. 查询MYSQL和查询HBASE速度比较

    上一篇文章:我要上谷歌 Mysql,关系型数据库: HBase,NoSql数据库. 查询Mysql和查询HBase,到底哪个速度快呢? 与一些真正的大牛讨论时,他们说HBase写入速度,可以达到每秒1 ...

  9. Oracle 性能查看

    http://blog.chinaunix.net/uid-20784775-id-373968.html

  10. Maven使用笔记(一)Maven安装及常用命令

    1.Windows下安装Maven 首先去下载Maven安装包,http://maven.apache.org/download.cgi,目前最新版本是 Maven 3.2.3 . 解压到本地,可以看 ...