C++信奥之径,锻炼思维,扎实算法——模拟与高精度算法(7)

B站影视 2024-12-16 06:56 2

摘要:随后我们考虑将这个表格转化为二维数组存储,定义score[i][j]表示小A出第i个手势、小B出第j个手势时的胜负,其中0表示平局,1表示小A胜,-1表示小B胜。

生活大爆炸版石头剪刀布

题目描述

算法解析

1、题干中给出了5种手势的胜负关系表,但是只展示了一半。我们先把另一半补全:

随后我们考虑将这个表格转化为二维数组存储,定义score[i][j]表示小A出第i个手势、小B出第j个手势时的胜负,其中0表示平局,1表示小A胜,-1表示小B胜。

数组初始化代码如下:

int score[5][5]={{0,-1,1,1,-1}, {1,0,-1,1,-1}, {-1,1,0,-1,1}, {-1,-1,1,0,1}, {1,1,-1,-1,0}};

2、由于小A和小B会以各自的周期出拳,因此我们要能想到,取模运算可以解决周期变化的问题,因此小A第i轮出的拳是a[i%na],对应小B的拳是b[i%nb],在从score数组中找到对应的胜负,如果1则小A加分,如果-1则小B加分,如果0则打平。

根据题干的描述与上述的分析,直接使用循环和分支语句的嵌套模拟该过程即可。

【参考代码】

#includeusing namespace std;int score[5][5]={{0,-1,1,1,-1}, {1,0,-1,1,-1}, {-1,1,0,-1,1}, {-1,-1,1,0,1}, {1,1,-1,-1,0}};int a[205],b[205];int main{ int n,na,nb; cin>>n>>na>>nb; for(int i=0;i>a[i]; } for(int i=0;i>b[i]; } int ansa=0,ansb=0; for(int i=0;i

代码中的C++知识解读

数组下标的应用

在学习数组的时候,同学们已经知道了数组下标是从0开始的,并且灵活运用数组下标可以解决很多问题。那么,数组下标具体有哪些应用呢?

(1)求某个区间里的元素个数

最直接的应用,就是能通过下标计算出某个区间里的元素个数,例如要计算从a[i]到a[j]之间的元素个数,直接使用公式:j-i+1,就能计算出来了。

(2)进行计数排序

根据数组下标是有序的特点,下标自身可以去映射一些元素,例如正整数、字母、字符串等。

例如洛谷上的“P1271 【深基9.例1】选举学生会”,由于候选人不超过1000人,我们可以直接定义计数数组“int count[1005]”,对于每张选票,假设选的是i,那么只要“count[i]++”,就可以记录投票结果,最后遍历整个count数组,只要对应的值不为0,就把下标输出即可。

感兴趣的同学们可以在阅读完成后去编写一下代码,感受数组下标在其中的作用。

(3)配合前缀和与差分算法使用

在前缀和算法中,我们会维护一个前缀和数组,其功能是存储数组前i项的和。下面的示例代码是一维数组的前缀和:

for(int i=1;i>a[i]; sum[i]=sum[i-1]+a[i]; //sum数组为a数组的前缀和}

那么,如果我们想要得到a数组在区间[x,y]这一段内的所有元素和,可以直接使用sum数组这两个位置的差值来求得:

ans = sum[y]-sum[x-1];

同样,在差分算法中,我们会维护一个差分数组,其功能是将原数组a当做是前缀和数组,计算相邻两个元素的差值。下面的示例代码是一维数组的差分:

for(int i=1;i>a[i]; cf[i]=a[i]-a[i-1]; //cf数组为a数组的差分}

那么,如果我们想要a数组的[x,y]这一段区间里的所有元素都要加上value,可以直接使用cf数组来实现:

cf[x]+=value;cf[y+1]-=value;

如果这时候我们将cf数组恢复成a数组,这一段区间里的所有元素就已经加上了value的值了。

不管是前缀和还是差分算法,都灵活运用到了数组下标的功能,并通过空间换时间的方式提升了算法的效率。

运行结果

来源:幻想家

相关推荐