圆皱率

173 阅读2分钟

题目链接

题目详情

孟德尔的豌豆杂交实验中有几个比较有趣的现象。 1.圆皮的性状占据3/4,皱皮只有1/4。所以在表现上,圆皮是比皱皮多的。(有趣的是,圆皮的数量比上皱皮的数量在大量数据支撑下(出题时的数据),是接近3.14的(1698.0w / 539.9w = 3.14……),所以有时候会戏称圆皱率) 2.圆皮是显性基因,皱皮是隐性基因。有些豌豆,看似是圆皮,但其实有皱皮基因,但只要沾一点圆,就是圆皮。 3.皱皮就是纯纯的皱皮,可以很明显的被看出。

现在有一排的圆皮和皱皮,你知道它们的基因、重量。根据圆皱率,纯纯的圆皮和纯纯的皱皮相邻时,特别容易变质。除此之外,纯纯的圆皮和纯纯的圆皮、纯纯的皱皮和纯纯的皱皮、不纯的圆皮和不纯的圆皮、不纯的圆皮和纯纯的圆皮、不纯的圆皮和纯纯的皱皮相邻时,都不容易变质。 在所有圆皮和皱皮都不变质的情况下,你要选择其中的一些圆皮和皱皮,但不改变它们的位置关系,使得它们的总重量最大。

输入描述

第一行输入一个正整数 n(1n2×105)n(1≤n≤2×10^5)表示圆皮和皱皮的总数量。

第二行输入 n 个正整数 ai(1ai109)a_i(1≤a_i≤10^9)表示圆皮和皱皮的重量。

第三行输入 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;
}