NOIP普及组模拟赛1

本文解析了NOIP普及组模拟赛中的四道编程题:QAQ子序列计数、跳格子最短步数、截木棍求最多截断段数以及用特定面额货币购买商品的方案数。题目涉及字符串处理、贪心算法、枚举和动态规划等编程技巧。
摘要由CSDN通过智能技术生成

疯狂QAQ

洛谷CF894A加强版

  • 题目描述
    给定一个长度为 n 的由大写字母组成的字符串,请计算该字符串有多少个子序列为 QAQ。
  • 输入格式
    一行,包含一个长度为 n 的字符串。
  • 输出格式
    一行,一个整数,表示答案。
  • 样例输入
    QAQAQYSYIOI
  • 样例输出
    4
  • 样例数据解释
    QAQAQYSYIOI
    QAQAQYSYIOI
    QAQAQYSYIOI
    QAQAQYSYIOI
  • 数据规模与约定
    对于 30% 的数据,1 ≤ n ≤ 100
    对于 60% 的数据,1 ≤ n ≤ 1000
    对于 100% 的数据,1 ≤ n ≤ 2 × 10^5

洛谷上的题数据范围较小,所以三层循环分别枚举QAQ位置就可以O(n³)暴力AC
对于本题数据只能拿到60分
换一种思路

枚举中间A的位置,分别把左边Q的数量和右边Q的数量统计出来,这个统计可以在枚举A之前完成,输入时先记录Q总量,再用两个变量统计左右Q的数量,枚举A位置时越过一个Q就将右Q–,左Q++。包含这一个A的QAQ的数量就是左边Q的数量×右边Q的数量。最后把所有A的答案加起来,O(n)带走。

#include<iostream>
#include<string>
using namespace std;
string in;
int lq,rq,qnum,ans;
int main(){
   
	cin>>in;
	for(int i=0;i<in.size();i++)
		if(in[i]=='Q')qnum++;
	rq=qnum;
	for(int i=0;i<in.size();i++){
   
		if(in[i]=='Q')lq++,rq--;
		if(in[</
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值