AcWing 4888. 领导者 本人的思路 简单了当

思路:

因为领导者要满足其中之一,

  • 名单中包含其品种的所有奶牛。
  • 名单中包含另一品种的领导者。

对于条件1--包含其品种的所有奶牛:意味着这头奶牛i必须是该品种的第一头(排在最前面的),且E[i]>=最后一头奶牛。这个好判断,我们只需记录每个品种的第一头奶牛和最后一头奶牛的下标,再判断是否E[FH] >= LH即可;

对于条件2--名单中包含另一品种的领导者:这个不好直接判断,只能先计算出另一品种奶牛领导者的下标才能计算的处理,所以我们考虑, 每一头H奶牛是否包含了G品种领导者奶牛

最后答案是两品种领导者数量的组合,即ans=cntG*cntH


int n;
char s[N];
int E[N];

void solve()
{
	cin >> n;
	int FH = 0,FG = 0,LH = 0,LG = 0;//第一头H奶牛的下标,第一头G奶牛的下标,最后一头H奶牛的下标,最后一头G奶牛的下标
	for (int i = 1;i <= n;i ++) 
	{
		cin >> s[i];
		if (!FH && s[i] == 'H') FH = i; 
		if (!FG && s[i] == 'G') FG = i;
		if (s[i] == 'H') LH = i; 
		if (s[i] == 'G') LG = i; 
	}
	
	for (int i = 1;i <= n;i ++) cin >> E[i];

	//条件1
	LL cntG = 0,cntH = 0;
	int idG = 0,idH = 0;
	if (E[FH] >= LH) cntH++,idH = FH;
	if (E[FG] >= LG) cntG++,idG = FG;

	//条件2
	if (idG)//如果G品种有领导者
	{
		for (int i = 1;i <= n;i ++)//是H奶牛,且包含G奶牛领导者,且不是H奶牛的领导者(避免重复计算)
			if (s[i] == 'H' && (E[i] >= idG && i <= idG) && i != idH) cntH ++;
	}
	if (idH)//同理
	{
		for (int i = 1;i <= n;i ++)
			if (s[i] == 'G' && (E[i] >= idH && i <= idH) && i != idG) cntG ++;
	}
	
	
	cout << cntH * cntG << endl;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值