第一次测试,三四两题

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;

}

   思路:输入,三重循环i,j,k,分别表示第i组基因,第i组基因中有斑点牛第j个位置的基因,无斑点牛第k个位置的基因,一旦位置i的斑点基因j的字母和非斑点基因k的字母相同,跳过i这个位置,否则答案数量增加,输出。

                                                     

现代艺术 
题目描述: 
世界各地的艺术评论家直到现在才开始意识到伟大的牛画家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)

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

输出格式(文件名 art.out)

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

样例输入: 
2230 
2737 
2777 
0000

样例输出: 
1

    思路:输入,循环i枚举每种颜色,四次循环找到该颜色的最大最小行列,再用两重循环扫描最大最小行列的方阵,如果扫到方阵中有不同与i的颜色,则对扫到的颜色进行标记,因为该颜色在其他颜色的方阵内,肯定是覆盖在其他颜色上的,所以该颜色就一定不是第一个涂上的颜色。最后一个循环扫描没被标记的颜色,输出。

    代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,vis[10]={};
 //vis[i]>0表示不是我要求的颜色,颜色分两类,1)没出现过2)被其他颜色包含 
char f[20][20];

void init()
{
 scanf("%d",&n);
 scanf("%c",&f[1][1]);
 for(int i=1;i<=n;++i)
  for(int j=1;j<=n+1;++j)
   scanf("%c",&f[i][j]);    
 return;    
}
void chuli()
{
 int ans=0; 
 for(int i=1;i<=9;++i)   
  {
   int x0=0,y0=0,x1=0,y1=0;
   for(int y=1;y<=n;++y) 
    for(int x=1;x<=n;++x)
     if(f[x][y]==i+48) {y1=y;break;}
     //y1为颜色i的最小列 
   for(int y=n;y>=1;--y)
    for(int x=1;x<=n;++x)
     if(f[x][y]==i+48) {y0=y;break;}     
     //y0 为最 大列 
   for(int x=1;x<=n;++x)
    for(int y=1;y<=n;++y)
     if(f[x][y]==i+48) {x1=x;break;}    
   for(int x=n;x>=1;--x)
    for(int y=1;y<=n;++y)
     if(f[x][y]==i+48) {x0=x;break;}
     //x1为  最小行,x0为最大行 
   if(x0==0&&y0==0&&x1==0&&y1==0) {vis[i]++;continue;}
   for(int x=x0;x<=x1;++x)
    for(int y=y0;y<=y1;++y)
     if(f[x][y]!=i+48&&f[x][y]!=48)  //如果 f[x][y]和颜色i不相同,那么这个颜色必然不是第一次出现    
      vis[f[x][y]-48]++;//vis[i]表示编号为i的颜色不是第一次出现 
  } 
  for(int i=1;i<=9;++i)
   if( vis[i]==0)     ans++;
  printf("%d",ans);
}
int main()
{
 freopen("art.in","r",stdin);
 freopen("art.out","w",stdout);
 init();
 chuli();   
 return 0;
}
这题虽然老师讲过,但还是没搞懂。这次测试总体来说是很难的,证明了自己还很菜,所以在未来一定要加紧努力。

重要的事情说三遍:我是蒟蒻,我是蒟蒻,我是蒟蒻
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值