机智零崎不会没梗Ⅲ (摊还分析)

题目描述

零崎总是说自己有一百种梗可玩,然而其实都是假的,是化学成分的,是特技。想要给摊还分析加个梗,实在是不好想,因为这个内容并不是什么算法,而是算法分析。

不过既然还得考,那么没有办法……

“势能法”是摊还分析中一种比较简单常用的方法,而且容易理解。现在零崎有K个硬币,规定每次“翻动”操作只能从最右侧开始翻转硬币,且如果把一个硬币从正面向上翻到背面向上,则需要对其左侧相邻的那个硬币也执行“翻动”操作(翻至最左则结束)。定义硬币组的势为硬币中正面向上的硬币的个数。现在要求你求出从某个给定的硬币组状态之后连续N个“翻动”操作的摊还代价。

硬币组的初始状态以一组数表示,0代表反面,1代表正面。

输入

多组测试数据。

每组测试数据共两行:

第一行K+1个正整数,分别为硬币组中硬币数K和初始状态(0<K<20);

第二行一个正整数,为题目要求你求出的“翻动”操作的个数N(0<N<30)。

输出

每组测试数据输出一行,此行第i个数输出初始状态后第i个操作的摊还代价(1<=i<=N)。

输入样例

3 0 0 0
2

输出样例

2 2

题目来源:http://biancheng.love/contest/23/problem/F/index所谓摊还分析:求数据结构中的一个操作序列中所执行的所有操作的平均时间,来评价操作的代价。我们可以说明一个操作的平均代价很低,即使序列中某个单一操作的代价很高。瘫痪分析不同于平均情况分析,它不涉及到概率问题,它可以保证最坏的情况下每个操作的平均性能。解题思路:在计算摊还代价时可以采用:聚合分析、核算法、势能算法。参考算法导论书中的例子:二进制计数器递增问题。通过题目要求可以得到,反转硬币其实也就是实现二进制计数器的递增问题,在摊还代价计算中得到如果反转到全为0,摊还代价为0,其他情况均为1,因此可以采用简单粗暴的方法。计算对应二进制的十进制数,由于反转硬币的摊还代价是有周期的(在给定二进制位数之后,周期为2^k);因此只需要判断是输出0还是输出2就可以了。本题代码:
 1 #include <bits/stdc++.h>
 2 #define max_size  21
 3 int a[max_size];
 4 using namespace std;
 5 int main()
 6 {
 7     int k,num,flag,N;
 8     while(~scanf("%d",&k))
 9     {
10         num=0;
11         flag=pow(2,k);
12         for(int i=1;i<=k;i++)
13             scanf("%d",&a[i]);
14         for(int i=1;i<=k;i++)
15             num+=a[i]*pow(2,k-i);
16         scanf("%d",&N);
17         int temp=flag-num;
18         for(int i=1;i<=N;i++)
19         {
20             if(i<=temp-1)
21             {
22                 if((i-1)==temp)
23                     printf("0 ");
24                 else
25                     printf("2 ");
26             }
27             else if(i>=temp)
28             {
29                 if((i+num)%flag==0)
30                     printf("0 ");
31                 else
32                     printf("2 ");
33             }
34         }
35         printf("\n");
36     }
37 }

采用判断是否所有位数都为0,来进行输出的另外一种方法:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int N;
 6     while(cin>>N)
 7     {
 8         int A[N],k;
 9         for(int i=0; i<N; i++)
10         {
11             cin>>A[i];
12         }
13         cin>>k;
14         int j=N-1;
15         for(int i=1; i<=k; i++)
16         {
17             while(j>=0 && A[j]==1)
18             {
19                 A[j]=0;
20                 j--;
21             }
22             if(j>=0)
23             {
24                 A[j]=1;
25                 cout<<"2 ";
26             }
27             else
28             {
29                 for(int k=0; k<N; k++)
30                     A[k]=0;
31                 cout<<"0 ";
32             }
33             j=N-1;
34         }
35         cout<<endl;
36     }
37 }
 
时间: 2024-10-09 07:33:58

机智零崎不会没梗Ⅲ (摊还分析)的相关文章

机智零崎不会没梗Ⅱ (哈夫曼编码、优先队列)

题目描述 你满心欢喜的召唤出了外星生物,以为可以变身超人拥有强大力量战胜一切怪兽,然而面对着身前高大的外星生物你一脸茫然,因为,你懂M78星云语吗?不过不用担心,因为零崎非常机智,他给出了关键性的提示:“讲道理,日语可是全宇宙通用语,所以为什么不试试和外星人讲日语呢?” 不过现在外星生物说的话都是“[email protected]#$%^&%#%I&!……”这样的东西,你要怎么转换成日语呢? 作位全宇宙通用的日语,自然有一套万能的转换算法,那就是Huffman编码转换!当然了这肯定不是普

简单理解算法篇--摊还分析

摊还分析是用来评价程序中的一个操作序列的平均代价,有时可能某个操作的代价特别高,但总体上来看也并非那么糟糕,可以形象的理解为把高代价的操作“分摊”到其他操作上去了,要求的就是均匀分摊后的平均代价. 摊还分析有三种常用的技术:聚合分析,核算法,势能法. 首先看个例子,现在有三种操作,push(s),pop(s),mutlipop(s,k),push(s),统称为栈操作. push(s)每次只能压一个数据,所以规定操作的代价为1,pop(s)每次只能弹一个数据,所以也规定操作的代价为1,而mutli

摊还分析

摊还分析 本章内容: 1.聚合分析 2.核算法 3.势能法 4.动态表 一 聚合分析 1. 在摊还分析中,我们求数据结构的一个操作序列中所执行的所有操作的平均时间,来评价操作的代价,它不涉及概率,可以保证最坏情况下每个操作的平均性能. 2. 摊还代价:对所有n,一个n个操作的序列最坏情况下话费时间为T(n),从而摊还代价(平均代价)为 T(n) / n. 3. 栈操作中加入MULTIPOP(S, k),可以同时删除栈顶的k个元素,总元素少于k则全部删除. 下面分析一个由n个PUSH, POP,

[算法导论]#1 摊还分析

目录 引言 聚集分析 记账方法 势能法 总结 引言 一个哈希表多大合适? 数据量为\(n?\),如果哈希表无限大(>=\(n?\)),那么时间复杂度是\(O(1)?\)的,不过很显然,虽然节省了时间,但是浪费了空间. 实际上在我们不知道数据量的情况下,我们无法确定哈希表的大小,这时我们有个很美丽的数据结构->动态表 动态表的工作原理 建立一个表,初始化大小为1. 如果表的容量不够,那么就把大小扩大为原来的两倍,将原来表的内容复制一遍 把原来表的内存释放,再执行插入 容量会以1,2,4,8,16

算法导论17:摊还分析学习笔记

在摊还分析中,通过求数据结构的一系列的操作的平均时间,来评价操作的代价.这样,即使这些操作中的某个单一操作的代价很高,也可以证明平均代价很低.摊还分析不涉及概率,它可以保证最坏情况下每个操作的平均性能. 摊还分析有三种常用的技术: 聚合分析,它确定$n$个操作的总代价的上界为$T(n)$,所以每个操作的平均代价为$\frac{{T(n)}}{n}$.每个操作都有相同的摊还代价. 核算法:分析每个操作的摊还代价,不同于聚合分析,每种操作的摊还代价是不同的,核算法将序列中较早的操作的余额作为“信用”

北风网 零基础到数据(大数据)分析专家-首席分析师

详情请交流  QQ  709639943 00.北风网 零基础到数据(大数据)分析专家-首席分析师 00.快速上手JMeter 00.Jmeter 00.2017年Java web开发工程师成长之路 00.R语言速成实战 00.R语言数据分析实战 00.Python+Django+Ansible Playbook自动化运维项目实战 00.Java深入微服务原理改造房产销售平台 00.Python3入门机器学习 经典算法与应用 00.老司机学python篇:第一季(基础速过.机器学习入门) 00.

零基础、转行学习Python是否还在纠结?这里告诉你答案!

Python编程语言由于自身具有的"清晰"."简略"等特点而受到众多使用Python编程语言的IT从业者喜爱.而且,对于初学者来说,比起其他编程语言,Python 更容易上手.加上很多企业都使用Python编程语言,促进了Python程序员的市场需求量增加. 转行零基础学Python编程开发难度大吗?从哪学起? 近期很多小伙伴问我,如果自己转行学习Python,完全0基础能否学会呢?Python的难度到底有多大? 今天,小编就来为大家详细解读一下这个问题. 学习Py

OSChina 周四乱弹 —— 没女朋友,还不让做春梦?

愚人节过去了,有多少同学偷偷摸摸地向女神表白了?你们又收到了多少张好人卡?如果在愚人节还没有人跟你表白,小小编觉得你这一年也不会有什么桃花运了. @EvaKing:好吧,转发. OSC 就在主页上懂了那么一点点手脚就把你吓成这样 @红薯没我帅:@红薯   赔我笔记本电脑打开osc页面掉下来了,吓我一跳,害我把豆浆喷到键盘上了,短路烧掉了昨晚加班敢的代码没提交,老大说等下找我-你赔我电脑 电脑烧掉不要紧,只要梦想在,你就拥有全世界 @Force武装卫队:愚人节计划 群发"亲爱的借我100块钱付个车

乐视云没创意,还拿“免费”说事儿

8月18日下午,乐视云正式发布的消息开始在朋友圈里刷屏.在一大堆的"创新"."颠覆"背后,还是那句"视频CDN免费.行业云免费"最吸睛.不过,在云计算已经进入发展快车道的今天,"免费"还能激起多大的浪花呢? 在云计算这个名词刚出现时,大多数人还搞不清云计算的真正内涵是什么,所以才有了"晕计算"这样的说法.不过,云计算的一个特征--"免费服务"却让很多人印象深刻,甚至很多人执拗地认为,云计