zoukankan      html  css  js  c++  java
  • Wannafly挑战赛29 御坂美琴(递归,模拟)

    链接:https://ac.nowcoder.com/acm/contest/271/A
    来源:牛客网
     

    御坂美琴

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 131072K,其他语言262144K
    64bit IO Format: %lld

    题解:对每一个数进行题述操作就ok,直到不能拆为止,对操作得到的数字,用map 标记一下(1表示可以得到,0表示得不到),最后再跑一遍,核对一遍。qwq

    题目描述

    misaka是呱太爷爷的小粉丝,呱太爷爷有一句话说的好:"一尺之棰,日取其半,万世不竭"。

    misaka现在有 n 个呱太玩偶放在一堆,每一次操作,misaka会选择当前个数 > 1 的一堆呱太玩偶。并将这一堆呱太玩偶分成 两堆,x 是当前这一堆玩偶的个数。现在 misaka 想将玩偶分成 m 堆,其中第 i 堆呱太玩偶的个数是 ai ,你需要告诉 misaka 是否能通过若干次操作将玩偶分成指定的这 m 堆。如果可以输出 ,否则输出

    输入描述:

    第一行两个数 n, m 。
    接下来一行 m 个数 ai 。

    输出描述:

    输出共一个字符串 ,表示 misaka 能否将玩偶分成指定的 m 堆。

    示例1

    输入

    复制

    4 1
    5

    输出

    复制

    ham

    备注:

    1 ≤ n ≤ 1018, 1 ≤ m ≤ 105, 1 ≤ ai ≤ 1018。

    AC代码 

    #include <iostream>
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=1e5+5;
    ll s[maxn];
    map<ll,ll>mp;
    void f(ll n){
        if(mp[n])return ;
        mp[n]=1;
        if(n==1)
            return;
        f(n/2);
        f(n-n/2);
    }
    int main(){
        ll n,m;
        cin>>n>>m;
        ll ans=0;
        for(ll i=0;i<m;i++){
            cin>>s[i];
            ans+=s[i];
        }
        if(ans!=n){
            cout<<"ham"<<endl;
            return 0;
        }
        f(n);
        for(ll i=0;i<m;i++)
            if(!mp[s[i]]){
                cout<<"ham"<<endl;
                return 0;
            }
        cout<<"misaka"<<endl;
        
        return 0;
    }
  • 相关阅读:
    无向图求所有路径C#版
    centos 7 无痛安装 es
    rust 实现协程池
    spring boot fat jar 引入新的jar 文件到classpath
    nicolaka/netshoot 强大的容器网络问题解决工具
    使用nsenter 解决tcpcollect容器网络捕捉问题
    centraldogma git 镜像配置
    jmespath java 使用
    使用apicurio-registry 管理schema
    bfe 简单学习示例
  • 原文地址:https://www.cnblogs.com/UUUUh/p/10284020.html
Copyright © 2011-2022 走看看