zoukankan      html  css  js  c++  java
  • hdu 3859 Inverting Cups

    题意是给出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<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<iomanip>
     5 #include<cmath>
     6 #include<cstring>
     7 #include<vector>
     8 #define ll __int64
     9 #define pi acos(-1.0)
    10 #define MAX 5000001
    11 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!"<<endl;
    26         else cout<<ans<<endl;
    27     }
    28     return 0;
    29 }
    View Code

  • 相关阅读:
    fastjson1.2.22-1.2.24 反序列化命令执行实践测试
    Spring boot JdbcTemplate sql注入测试
    java反序列化命令执行测试实践
    SpringBoot 整合mybatis SQL注入漏洞实践
    SpringBoot整合mybatis入门
    python函数默认参数为可变对象的理解
    python笔记
    python
    python面向对象
    ICMP
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3240043.html
Copyright © 2011-2022 走看看