NOIP

题目大意:

你知道New Orange Industry Palatable公司吗?这是老板Smart为了与苹果公司竞争而新开的一家橘子公司,它的业务是栽培美味的橘子并售卖,公司简称为NOIP。 NOIP公司新推出N+1个橘子,每个橘子上都贴有一个标签,其中有N个普通的橘子上面印有一个”N”或”O”或”I”字母。还有一个独一无二的幸运橘子标签印有”P”字母。 NOIP公司搞了一个优惠活动,把N个普通橘子排成一排,从左到右依次编号为1~N。让顾客从左到右选三个橘子,如果依次排列组成了”NOI”,就可获得优惠券。Smart想把贴有标签P的幸运橘插入到排列中的(可以插入到队列的任意位置)。在换取优惠券时,P橘子可以作为N橘子或O橘子或I橘子使用。Smart想知道加入P橘子以后,第一个选购的顾客最多有多少种选法可以得到优惠券。

解题思路:

一系列骚操作。模拟+一系列优化、剪枝+骚操作

#include <cstdio>
#include <algorithm>
using namespace std;
char c[100005],l[3]={'N','O','I'};
int n,sI,sN,sO,ai,an,ao,a[100005],b[100005],ansum;
unsigned long long ans;
int main()
{
    //freopen("noip.in","r",stdin);
    //freopen("noip.out","w",stdout);
    scanf("%d\n",&n);gets(c);
    for(int i=0;i<n;i++)
     if(c[i]=='I') sI++;//先统计I的个数
    for(int i=0;i<n;i++)
     {
        if (c[i]=='N') sN++;a[i]=sN;//前面N的个数(包括本身)
        if (c[i]=='I') sI--;b[i]=sI;//后面I的个数(包括本身)
        if (c[i]=='O') ans+=a[i]*b[i],an+=sN,ai+=sI;//计算插入O会增加几个方案数~
     }
    for (int i=0;i<n;i++)ao=max(ao,a[i]*b[i]);//然后一系列比较(骚操作)
    ans+=max(ao,max(an,ai));//接着还是一系列比较(骚操作)
    printf("%llu",ans);//输出就OK了~
}

转载于:https://www.cnblogs.com/Juruo-HJQ/p/9306952.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值