第二次信奥考试试题及题解(部分)

第二次信奥考试试题及题解(部分)

试题一;1.栅栏作画

  (paint.pas/c/cpp)

【问题描述】

冬去秋来,时光总是改变一些东西。随着农夫Farmer John的老去,他的栅栏也越来越丑陋了,本着处女座原则,农夫Farmer John决定做点什么了!他要给的栅栏重新作画。但是年老的Farmer John并不能独立完成所有的栅栏的绘画。所以他找到了他最钟爱的奶牛Bessie,来帮助他完成工作。

为了简化问题,我们把所有栅栏看成一条直线,每个栅栏杆是这个直线单位长度John开始从a刻度到b刻度之间的栅栏进行绘画。也就是说他完成了ba个栅栏的绘画(b>a),比如说a3b5那么John完成了两个栅栏的绘画。

同时奶牛Bessie完成cd的绘画,但是年老John无法回忆起他已经对那些栅栏进行处理了所以对于cd可能和ab重复的绘画处。那么我们要求求出一共对多少栅栏进行了绘画。(c<d,a<b

【输入】

输入数据一共有两行,第一行分别为ab第二行分别为cd用一个空格隔开。

【输出】

输出一个正整数表示总共对多少个栅栏进行了绘画。

【输入输出样例1

paint.in

paint.out

7 10

4 8

6

【数据范围】

   保证所有数据在[0100]区间且均为正整数。

分析:看到这个题面后,我第一个反应就是校门外的树,于是我啥都没看直接做了起来,结果只拿了70分。那么看到题面后,还是能知道这个和校门外的树是不太一样的,这道题从ab是指算(b-a)个的,不同之处就体现在这。那么我们根据这个用两层循环模拟即可。接下来为大家献上正确代码(也许吧):

#include<bits/stdc++.h>

using namespace std;

int main(){

freopen("paint.in","r",stdin);//不必管

freopen("paint.out","w",stdout);//不必管

long int a[102],i,j,n,m,x,y,s=0;

for (i=1;i<=102;i++) a[i]=1;//初始化,一开始全部都没画过

for (i=1;i<=2;i++){

cin>>x>>y;//xy

for (j=x;j<=y-1;j++){//注意这步

if (a[j]) s++;//意思为如果没画过,那么个数加一。(因为有一点桶排思想,所以不必想重复)

a[j]=0;//在置0,表示画过

}

}

cout<<s;//输出

return 0;

}

试题二:失去的母牛

文件名(lostcow.cpp

题目描述

FJ丢失了他引以为傲的牛Bessie,他必须找到他!
  幸运的是,农场间只有一条长路径,而且FJ知道Bessie会在这条路的一些点上。如果我们把这条路看作一条数轴,那么FJ现在在x点上,而Bessie在y点上(FJ不确定)。如果FJ只知道Bessie大致在哪里,他只能径直向它走|x-y|的距离。不幸的是,由于黑山老树精的出没,外面很黑,FJ看不见任何东西。他唯一能找到Bessie的办法是来回走动直到他最终到达了Bessie所在的位置。
    为了找出搜索的最佳方案,FJ咨询了信息大佬——Aico(黄加瑜)。Aico告诉他这是个经典的计算机问题,叫做“Lost Cow Problem”(丢失牛问题)(这是真的!)。
    FJ找牛的最佳方案是先移动到x+1的位置,然后反向移动到x-2,接着是x+4,以此类推。在一个“之字形”模式中,他每一步移动后离起点的距离是上一步时离起点距离的两倍x+1x-2x+4。正如他在学习“丢失牛问题”算法时一样,这种方式能让他在最坏情况下总共走9倍的实际距离(|x-y|)。(这也是真的!9倍实际距离实际上就是这种算法最坏的情况)

Farmer John想去验证这个结果。已知x和y,请编程计算他找到Bessie所行走的距离。

输入输出格式

输入格式:(lostcow.in)

一行个数据 x和y。

输出格式:(lostcow.out)

一个数据,表示Farmer John将前往Bessie的距离。

输入输出样例

输入样例:

3 6

输出样例:

9

数据范围

0<=x,y<=1000

分析:看到这一题,就能想到是一道纯模拟,不停地往返走,直到走到遇见了奶牛为之。不过这需要考虑几点:一点就是如果奶牛在人的右边(奶牛位置大于人的位置),需要走到刚好遇见奶牛或者超过奶牛(超过部分不能算),如果奶牛在人的左边(奶牛位置小鱼人的位置),那么人就需要走到刚刚遇见奶牛或者走到比奶牛小的位置(同样超出部分不算),还有就是相等,不走。代码如下:#include<bits/stdc++.h>

using namespace std;

int main(){

freopen("lostcow.in","r",stdin);

freopen("lostcow.out","w",stdout);

long int n,m;

long int x,y,k=1;

long int ans,s=0;

bool f=0;//判断是正还是负,其实也不用那么麻烦,直接乘-2就行

cin>>n>>m;

x=n;y=n;

while (1){

if (n==m) break;//一种情况,两者相等

f=!f;//每次置反

if (f) x=n+k;else x=n-k;

s+=abs(x-y);

y=x;k*=2;

if ((n<m)&&(x>=m)){//第一种情况,奶牛位置大于人的位置

s-=x-m;break;//减掉多余的

}

if ((n>m)&&(x<=m)){//第二种情况,奶牛位置小于人的位置

s-=m-x;break;//减掉多余的

}

}

cout<<s;//输出

return 0;

}

看到模拟类的题目,不必害怕,先分析再按步骤模拟就行。

试题三:

T3牛的基因组学

声明

不开O2优化!!!

样例输入文件,样例输出文件见下。

题目描述

农夫舒婧拥有n头有斑点的奶牛和n头没有斑点的奶牛。由于她刚刚完成了关于牛的基因的一门课程,所以她相信,她的奶牛身上的斑点是由于奶牛基因组上单个位置的基因突变引起的。农夫舒婧花费了巨大的代价,把她的奶牛的基因组进行了排序。每一个基因组都是一个由ACGT四个字母组成的长度为m的字符串。排列的牛的基因组时,她得到了以下的表格,(此时n=3

位置

1

2

3

4

5

6

7

M

有斑点的牛 1

A

A

T

C

C

C

A

T

有斑点的牛 2

G

A

T

T

G

C

A

A

有斑点的牛 3

G

G

T

C

G

C

A

A

无斑点的牛 1

A

C

T

C

C

C

A

G

无斑点的牛 2

A

C

T

C

G

C

A

T

无斑点的牛 3

A

C

T

T

C

C

A

T

仔细观察这张表,她推测,位置2是基因组中可能解释斑点的潜在位置。也就是说,通过查看这张表,农夫舒婧可以预测她的哪头奶牛是有斑点的,哪些不是(这里,AG意味着斑点,C意味着无斑点; T是无关紧要的,因为它不会出现在任何奶牛的位置2)。位置1本身不足以解释斑点,因为这个位置的A可能表明一头斑点的牛或一头无斑点牛。

给出农民舒婧的奶牛的基因组,请计算潜在解释斑点的数目。

输入输出格式

输入格式(文件名  cownomics.in):

输入数据第一行包含两个小于100的正整数NM。下一行至第N+1行每行包含一串长为M的字符串,表示斑点牛的基因组。第N+2行至最后每行同样包含一串长为M的字符串,表示普通奶牛的基因组。

输出格式(文件名 cownomics.out):

请计算在基因组中可能导致斑点病的位置的数量(一个大于等于0,小于等于M的整数)。

样例输入输出

样本输入

3 8

AATCCCAT

GATTGCAA

GGTCGCAA

ACTCCCAG

ACTCGCAT

ACTTCCAT

样本输出

1

分析:这个提议大家也许很难看懂。意思就是如果这一组的有斑点奶牛和无斑点奶牛包括的字母全部不一样的话,记住,是全部不一样!(如第二组),那么就是一个位置。代码如下:

#include<bits/stdc++.h>

using namespace std;

int main(){

freopen("cownomics.in","r",stdin);

freopen("cownomics.out","w",stdout);

string s[102],s1[102];

long int ss=0,i,j,n,m,len,k;

bool f=1;

cin>>n>>len;

for (i=1;i<=n;i++) cin>>s[i];//有斑点奶牛

for (i=1;i<=n;i++) cin>>s1[i];//无斑点奶牛

for (j=0;j<=len-1;j++){//从列循环

f=1;//判断这个位置是否为有斑点奶牛

for (m=1;m<=n;m++){//循环有斑点

    for (i=1;i<=n;i++){//循环无斑点奶牛

      if (s[m][j]==s1[i][j]) {f=0;break;}//如果一有相同,就说明不是

  }

    if (!f) break;//如果不是的话,这个也不用循环了,直接退出

}

if (f) ss++;//如果是数目加一

}

cout<<ss;//输出

return 0;

}

试题四:

现代艺术

题目描述:

世界各地的艺术评论家直到现在才开始意识到伟大的牛画家Bibi的创意天赋。

Bibi用一种特殊的方式绘画。她用一块N*N的画布开始画画 “0”表示一个画布的空单元格。然后她在画布上画了9个矩形。她会使用9种颜色的一种(为了方便(Bibi是个很懒的人),她把颜色编号为1~9. 每次可以选择任意一种未使用过的颜色进行绘画。

举个例子,如果她从颜色2开始画,下面是她画画的过程:

2220

2220

2220

0000

然后她可能画了一个颜色为7的矩形:

2220

2777

2777

0000

随后她画了一个颜色为3的小矩形:

2230

2737

2777

0000

每一个矩形的边都是平行于边缘的,鉴于画布的最终状态,请计算出画布上有多少种颜色可能是第一次被画上去的。

(矩形的大小是不确定的  可能是一个单元格  也可能覆盖整个画布)

输入格式(文件名:art.in

第一行是整数n1<=n<=10)下面n*n的矩阵由数字0~9组成,描述的是最后完成的画布。

输出格式(文件名 art.out

输出一个整数 表示最终画布的颜色中,可能为第一个画上去的颜色个数。

样例输入:

4

2230

2737

2777

0000

样例输出:

1

正解待想中。

猜你喜欢

转载自blog.csdn.net/huang_ke_hai/article/details/78418620