zoukankan      html  css  js  c++  java
  • SSLZYC NOIP

    题目大意:
    有n个橙子排成一列,每个橙子上都有NOI三个字母中的一个,若从左到右连续拿3个橙子,三个橙子的字母依次是NOI,就成功获得奖励。现在将贴有字母P的橙子放入其中,可以选择当做任意一个字母,请问放了橙子P之后一共有多少种方法可以得到奖励?


    思路:
    这道题我一开始以为是最长不下降序列类型的题目,但是后来想了一下,感觉不对。于是思考了另外一种方法:
    从0到n枚举字母O(中间的字母),然后计算出使用O的可以排成NOI的序列数量,和maxn比较。最终答案储存在maxn中。


    代码:

    #include <cstdio>
    using namespace std;
    
    long long n,I[100001],N[100001],O[100001],sumi,sumn,maxn,ans,j,k1,k2;
    char s[100001];
    
    long long max(long long a,long long b)
    {
        return a>b?a:b;
    }
    
    int main()
    {
        freopen("noip.in","r",stdin);
        freopen("noip.out","w",stdout); 
        scanf("%lld\n",&n);
        gets(s);
        for (int i=0;i<=n-1;i++)
         if (s[i]=='I') sumi++;  //数出I的个数
        for (int i=0;i<=n-1;i++)
        {
            if (s[i]=='I') sumi--;N[i]=sumi;  //位于s[i]右边的i的个数
            if (s[i]=='N') sumn++;I[i]=sumn;
            if (s[i]!='O') continue;  //不是O就进行下一次循环
            k1+=sumn;
            k2+=sumi;
            ans+=sumi*sumn;
        }
        j=0;
        for (int i=0;i<=n-1;i++)  //枚举O
         maxn=max(maxn,I[i]*N[i]);
        printf("%lld\n",ans+max(max(k1,k2),maxn));
        return 0;
    }
  • 相关阅读:
    LeetCode 226. Invert Binary Tree
    LeetCode 221. Maximal Square
    LeetCode 217. Contains Duplicate
    LeetCode 206. Reverse Linked List
    LeetCode 213. House Robber II
    LeetCode 198. House Robber
    LeetCode 188. Best Time to Buy and Sell Stock IV (stock problem)
    LeetCode 171. Excel Sheet Column Number
    LeetCode 169. Majority Element
    运维工程师常见面试题
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313124.html
Copyright © 2011-2022 走看看