主页
搜索
最近更新
数据统计
赞助我们
系统公告
1
/
1
请查看完所有公告
P2075题解
最后更新于 2025-06-15 14:54:20
作者
瀛洲仙子
分类
题解
题解
P2075
复制 Markdown
查看原文
更新内容
### 题意简述 - 输入三个整数 $n$,$m$,$len$,表示 $n$ 个人参加计划,每个人基因长度为 $len$。 - 接下来 $n$ 行,每行 $len$ 个字符,表示每个人的基因。 - 当两个人同一位置的基因成功配对,主人公将会收到一条消息,且这两个位置的基因不再与任何人配对。 - 求主人公可以收到多少条配对成功消息。 ### 样例分析 样例输入: ``` 4 3 4 ATCG AGTC CAGT TGCA ``` - 第一行第一个 A 和第四行第一个 T 配对成功,收到第一条配对成功消息。 - 第一行第二个 T 和第三行第二个 A 配对成功,收到第二条配对成功消息。 - 第一行第三个 C 和第三行第三个 G 配对成功,收到第三条配对成功消息。 - 第一行第四个 G 和第二行第四个 C 配对成功,收到第四条配对成功消息。 - 第三行第四个 T 和第四行第四个 A 配对成功,收到第五条配对成功消息。 样例输出: ``` 5 ``` ### 题目分析 首先输入,不用解释。 ```cpp int n,m,len;cin>>n>>m>>len; ``` 接下来二维字符数组,用来存储基因。 ```cpp char buf[n][len]; for(int i=0;i<n;i++) for(int j=0;j<len;j++) cin>>buf[i][j]; ``` 定义计数器,表示主人公接收到的消息。 ```cpp int cnt=0; ``` 接下来是最重要的循环,遍历每个人的基因,如果符合配对条件,那么将计数器加一。 ```cpp for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { for(int k=0;k<len;k++) { if(buf[i][k]=='A' and buf[j][k]=='T') { cnt++; buf[i][k]='?'; buf[j][k]='?'; } if(buf[i][k]=='C' and buf[j][k]=='G') { cnt++; buf[i][k]='?'; buf[j][k]='?'; } } } } ``` 请注意,将字符标为问号,目的是防止再次配对。 最后一步,输出。 ```cpp cout<<cnt; ``` ### 代码 根据以上步骤,最终代码如下。 ```cpp #include<iostream> using namespace std; int main() { int n,m,len;cin>>n>>m>>len;//输入 char buf[n][len];//存储基因 int cnt=0;//计数器 for(int i=0;i<n;i++) for(int j=0;j<len;j++) cin>>buf[i][j];//输入基因 //遍历基因组,并配对 for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { //遍历每一个碱基链 for(int k=0;k<len;k++) { if(buf[i][k]=='A' and buf[j][k]=='T') { cnt++; buf[i][k]='?'; buf[j][k]='?'; } //如果有配对成功,那么将计数器加一,且把那个位置替换成问号,以防再次配对 if(buf[i][k]=='C' and buf[j][k]=='G') { cnt++; buf[i][k]='?'; buf[j][k]='?'; } } } } cout<<cnt;//输出 } ``` 珍爱生命,远离抄袭,共创文明洛谷,从我做起!
正在渲染内容...
点赞
4
收藏
0