Wannafly挑战赛29 A御坂美琴(思维题+dfs)
题意:
一开始有n个糖果,每一次操作,你可以选择一堆x将其分成两堆,x//2,x-x//2
直到一堆的糖果数量=1就不能进行操作了。
然后现在给你m堆糖果a[1..m],问你能不从n个通过任意操作变成当前的局面
解析:
官方题解:
我们维护当前堆的集合和⽬标集合,每次拿出当前个数最多的⼀堆,和⽬标中个数最多的⼀堆⽐较。如果当前的较 少,那么就是不能。如果相等,就把选出的这两堆扔掉,否则就对当前个数最多的那⼀堆进⾏⼀次操作。 如果操作次数⼤于 或者操作完之后当前堆的集合或⽬标集合还有剩余就是不能,否则就是能。
做的时候大佬发现只要a里面的数都可以通过n变换到,并且a[]的和=sum,那么就是可以的
#include <cstdio>
#include <cstring>
#include<algorithm>
#include<set>
using namespace std;typedef long long ll;
const int MAXN = 1e5+100;
ll a[MAXN];
ll c[200];
int lnum[2];
ll lval[2];
int vis[2];
set<int> mm;int main()
{ll n;int m;scanf("%lld%d",&n,&m);int maxx=0;int cnt=0;c[cnt++]=-n;ll yu=n;mm.insert(yu);while(n){c[cnt++]=-n/2;n/=2;mm.insert(n);mm.insert(n+1);}mm.insert(2);mm.insert(1);//sort(c,c+cnt);ll sum=0;int flag=1;for(int i=1;i<=m;i++){scanf("%lld",&a[i]);sum+=a[i];if(mm.count(a[i])==0){flag=0;}}if(!flag||sum!=yu){printf("ham\n");}else{printf("misaka\n");}}
本来想在题解里面找证明的,但是发现这个直接暴力就可以做。
用dfs遍历这个操作得到的树,如果在遍历这棵树的时候,可以把a[]里面的数对应到每一个树的结点上,那么就是可以的
那么复杂度最多只会遍历树上的m条链,并且一旦你通过一条链遍历到叶子结点,那么肯定是不行的,这条链上没有点、
可以对应a[]中的数
dfs复杂度为O(m*logn)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <iostream>
#include <map>
#define pb push_back
#define mk make_pair
typedef long long ll;
using namespace std;
typedef pair<int,int> PII;
const int MAXN = 1e5+10;
const ll MOD = 998244353;
ll n,m;
map<ll,int> mp;int f;void dfs(ll x)
{if(!f) return ;if(mp[x]){mp[x]--;return ;}if(x==1) {f=0;return;}ll tmp=x/2;dfs(tmp);dfs(x-tmp);
}int main()
{cin>>n>>m;ll v,sum=0;for(int i=1;i<=m;i++)cin>>v,mp[v]++,sum+=v;f=1;if(sum!=n) f=0;if(f) dfs(n);if(f){for(auto v:mp){if(v.second>0){f=0;break;}}}if(!f) cout<<"ham"<<endl;else cout<<"misaka"<<endl;}
Wannafly挑战赛29 A御坂美琴(思维题+dfs)相关推荐
- 牛客Wannafly挑战赛29 A 御坂美琴 思维题
链接:https://ac.nowcoder.com/acm/contest/271/A 来源:牛客网 题目描述 misaka是呱太爷爷的小粉丝,呱太爷爷有一句话说的好:"一尺之棰,日取其半 ...
- Wannafly挑战赛29 御坂美琴(递归,模拟)
链接:https://ac.nowcoder.com/acm/contest/271/A 来源:牛客网 御坂美琴 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...
- Wannafly挑战赛29-A御坂美琴 (dfs+map)
链接:https://ac.nowcoder.com/acm/contest/271/A 来源:牛客网 御坂美琴 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...
- 解读御坂美琴みさか的菱形打印程序——谈如何学习算法
百度C语言吧主御坂美琴みさか的<C语言循环的小艺术>很久以前我就复制下来收藏了,不过一直没有研究.昨天Uval的AOAPC I: Beginning Algorithm Contests ...
- SCU-4396 麦野沉利与御坂美琴的战斗
4396: 麦野沉利与御坂美琴的战斗 Submit your solution Discuss this problem Best solutions 描述 麦姐辛苦建立的实验室被入侵 ...
- 御坂美琴(入门bfs+STL)
御坂美琴 misaka是呱太爷爷的小粉丝,呱太爷爷有一句话说的好:"一尺之棰,日取其半,万世不竭". misaka现在有 n 个呱太玩偶放在一堆,每一次操作,misaka会选择当前 ...
- Wannafly挑战赛29A御坂美琴
传送门 这套题很有意思2333 蠢了--首先先判总共加起来等不等于\(n\),不是的话就不行 然后dfs记录\(n\)不断分下去能分成哪些数,用map记录一下,判断是否所有数都能被分出来就是了 //m ...
- 牛客21477 御坂美琴
链接 点击跳转 题解 这个题是个思维题 首先如果所要求的数字之和不等于n,就直接判为无解.这一点很重要,可以保证后面算法的复杂度. 然后不停的把最大的分成两半,随时把符合条件的堆删掉,如果要求的堆的最 ...
- 牛客NC21477 御坂美琴
题目描述: misaka是呱太爷爷的小粉丝,呱太爷爷有一句话说的好:"一尺之棰,日取其半,万世不竭". misaka现在有 n 个呱太玩偶放在一堆,每一次操作,misaka会选择当 ...
最新文章
- 谷歌论文:使用深度强化学习的芯片布局
- linux 0.11根文件系统,linux内核与根文件系统之间的关联的理解
- java not found_java_home not found in your enviroment 问题解决方法
- 实验报告类与对象水井问题_物业设施设备巡检检查对象、周期和频次
- 自定义控件_水平滑动的View 自定义属性
- java语言基础教程课后答案,积累总结
- 开源云平台 CloudStack 4.1.0 安装详解 - 3、vCenter
- linux java mysql 乱码_Linux下MySQL的字符集乱码问题总结
- 硬件创业者们,如何避免掉到供应链的大坑里爬不出来
- Unity3D基础38:角色控制器组件
- 网上图书商城项目学习笔记-034订单管理
- 请求的资源不可用html,“HTTP状态404请求的资源不可用”
- 用循环队列模拟滑动窗口动态求最值及峰峰值
- matlab2017b安装之后点桌面图标黑框闪退
- Windows-dos命令
- SAR舰船数据集----SSDD
- java数组总结及键盘输入方法
- Linux Glibc幽灵漏洞紧急修补方案
- 实验四:201571030116/201571030106《小学四则运算练习软件需求说明》结对项目报告...
- 新时达工业机器人技术储备_建成年产万台机器人工厂后, 新时达在想些什么?...
热门文章
- 深入理解Callback函数
- 2020年Python最新面试题(五):数据库相关(一)
- 华为修改优先级命令_华为交换机STP 根ID优先级设置
- 荣耀es什么时候支持鸿蒙,华为手机明年将全面支持鸿蒙!
- mysql报错2_mysql 启动报错--发现系统错误2,系统找不到指定的文件。?报错-问答-阿里云开发者社区-阿里云...
- java web实现锁屏操作_javaWeb锁屏的简单实现
- HttpClient内外访问外网,添加代理(二)
- html 判断页面加载完成,Javascript判断页面是否加载完成
- 七、完善:飞机生命值和子弹杀伤力(雷霆战机)
- 万字逐行解析与实现Transformer,并进行德译英实战(一)