开始: 2022-04-16 19:00:00

2022年4月双周赛2(初级班)

结束: 2022-04-16 21:30:00
当前: 2025-0505-3131 09:37:38  类型:OI 状态:已经结束 

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;

}