2022年4月双周赛2(初级班)
A.传染病
每只小动物每轮能传染x只,被传染后的小动物又会继续传染其他小动物,因此我们循环每一轮,以now作为当前被传染小动物的数量。因此,经过每一轮传染后,被传染的小动物数量就是当前被传染的小动物数量now加上新被传染的小动物数量 now * x 所以说每轮结束后,被传染的小动物数量就是now * x + now了。
注意要用long long,代码如下:
#include <bits/stdc++.h>
using namespace std;
long long now = 1,x,n;
int main()
{
cin>>x>>n;
for(int i=1;i<=n;i++)
{
now = now * x + now;
}
cout<<now;
return 0;
}
B.金币
一道简单的模拟题,思路见代码:
#include <iostream>
using namespace std;
int n,q,c,s;
//n是有多少天
//s是获得的金币总量
//c是每天能获得的金币数
//q表示往后数q天,获得的金币都是c个
int main()
{
cin>>n;
c=q=1; //第一天(往后的一天),获得1个金币
for(int i=1; i<=n; i++) //要发n天金币
{
s+=c; //累加
q--; //已经发了一天
if(q==0) //要更新数据
{
c++; //每天获得金币的数量+1
q=c; //根据题意,以后的c天都是c个金币,q就是c
}
}
cout<<s;
return 0;
}
C.询问学号
这道题考察对数组的应用,题目看起来复杂,但做起来很简单,同学们主要错在没有注意一些细节。
第一,较大的数组不能定义在函数内,应该定义为全局变量。比如这道题,很多同学在main函数内定义了a[n]这个数组,但这个数组可能有2000000这么大,就会产生“爆栈”的情况。(爆栈的意思是,定义在函数内的变量存储在一个叫栈的空间中,但栈空间大概只有几兆,如果这个数组过大就会把空间撑爆)
第二,许多同学把2000000看成了1000000,这提醒我们要仔细读题,不要想当然。
这道题的数据有一些小问题,大数据在前,小数据在后,导致大部分同学的分数较低(一般就算犯了以上错误也能得到40分)。但正式考试中不会出现类似的情况,都会是小数据在前,大数据在后。希望同学们吃一堑长一智,注意不要失去本应拿到的分数。
代码如下:
#include<bits/stdc++.h>
using namespace std;
long long a[2000001];
int main()
{
long long n,m,x;
cin>>n>>m;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=m;++i) {
cin>>x;
cout<<a[x]<<endl;
}
return 0;
}
D.反转
看到这道题可能大家会想到曾经学过的三位数反转,从而把以前的方法套用进来。
但这道题是一道比较简单的题,理解题意后,我们可以用更简单的方法去处理它:读入这个字符串,倒序输出即可。
具体实现上,由于保证了数据范围,也保证了只有一位小数,我们可以直接读入字符串并翻转,也可以直接读入四个数字字符,后一种方法代码如下(scanf引号中的 ‘ . ’ 表示读入时忽略该符号):
#include<bits/stdc++.h>
using namespace std;
char a, b, c, d;
int main()
{
scanf("%c%c%c.%c", &a, &b, &c, &d);
printf("%c.%c%c%c", d, c, b, a);
return 0;
}