题目详情
孟德尔的豌豆杂交实验中有几个比较有趣的现象。 1.圆皮的性状占据3/4,皱皮只有1/4。所以在表现上,圆皮是比皱皮多的。(有趣的是,圆皮的数量比上皱皮的数量在大量数据支撑下(出题时的数据),是接近3.14的(1698.0w / 539.9w = 3.14……),所以有时候会戏称圆皱率) 2.圆皮是显性基因,皱皮是隐性基因。有些豌豆,看似是圆皮,但其实有皱皮基因,但只要沾一点圆,就是圆皮。 3.皱皮就是纯纯的皱皮,可以很明显的被看出。
现在有一排的圆皮和皱皮,你知道它们的基因、重量。根据圆皱率,纯纯的圆皮和纯纯的皱皮相邻时,特别容易变质。除此之外,纯纯的圆皮和纯纯的圆皮、纯纯的皱皮和纯纯的皱皮、不纯的圆皮和不纯的圆皮、不纯的圆皮和纯纯的圆皮、不纯的圆皮和纯纯的皱皮相邻时,都不容易变质。 在所有圆皮和皱皮都不变质的情况下,你要选择其中的一些圆皮和皱皮,但不改变它们的位置关系,使得它们的总重量最大。
输入描述
第一行输入一个正整数 表示圆皮和皱皮的总数量。
第二行输入 n 个正整数 表示圆皮和皱皮的重量。
第三行输入 n 个长度为2的字符串表示圆皮和皱皮的基因,其中 AA 表示纯纯的圆皮,Aa 表示不纯的圆皮,aa 表示纯纯的皱皮。
输出描述
一个正整数表示最大的总重量。
输入
6
1 1 4 5 1 4
AA AA aa Aa aa AA
输出
13
解题思路
这道题的意思其实就是不能让AA和aa放在一起,(不能相邻)。其次,对于每一颗豌豆,都对应一个重量和基因型,所以这里我用结构体来存储没个豌豆的信息。然后,对于AA和aa,我们他们计算所有的重量,sum1,sum2。然后如果基因型为Aa,我们就记录sum1,sum2的最大值+当前豌豆的重量。并将sum1,sum2置0。不要忘记最后循环完毕还要更新一次sum。
AC代码
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define endl '\n'
const int N = 200010;
struct bean
{
ll id;
string gen;
};
int main()
{
bean b[N];
ll n;
cin>>n;
ll sum = 0;
for(int i=0;i<n;i++)
{
cin>>b[i].id;
}
ll sum1=0,sum2=0;
for(int i=0;i<n;i++)
{
cin>>b[i].gen;
if(b[i].gen=="AA") sum1+=b[i].id;
else if(b[i].gen=="aa") sum2 +=b[i].id;
else
{
sum += max(sum1,sum2) + b[i].id;
sum1=0,sum2=0;
}
}
sum += max(sum1,sum2);
cout<<sum;
return 0;
}