啊这
感觉不太可做
观察性质,发现这个字符串只由ABC构成
这个性质必须利用
仅仅由3种字符组成意味着什么呢?
这个字符串只有种可能性
这个有什么用呢?
只是说明暴力枚举的时间复杂度会小一些而已。
不止是这些。

首先有一些的性质

1.如果这个栈的顶端和当前的字符是一样的,那么肯定是直接取出来的
2.如果这个栈的第二的字符和当前的字符是一样的,那么先弹出一个然后输出肯定是不会不优
3.必定存在一个转折点,这个转折点前的决策方法如上,这个转折点后的决策方法是一直弹出知道这个字符被找到然后在输出,因为栈中的字符一定是3个字符在循环,所以每次最多就只会有400个字符
我们枚举这个转折点, 然后在暴力按照上面的方法进行模拟,是

这个比普通的暴力优秀的原因就是因为他枚举了一个关键——转折点
这个其实才是最重要的性质

这个我会给出证明。

考虑一个序列S​,对于一个没有转折点的模拟方法,那么在最后可能会在栈中留下很多的字符,这些肯定是要最后弹出的,我们就先忽略掉弹出的花费,因为在这两种情况中,最后弹出的花费是一样的。

在最后,如果在这个栈里面有很多的数,我们在后面加数的话,就必定是要1到3的花费,而如果我们只是弹出的话,只需要1即可。说明在可以的情况下,弹出数字来寻找数字,是要比加入更优秀的。

那么,为什么不可以弹出寻找后在继续加入,然后在弹出呢?(即是有多个转折点)
在中间的时候如果要弹出来寻找的话,那么就是如上面所说的情况1,和2,肯定是这两种决策更优的。

所以,肯定有且仅有一个转折点。

然后直接按照这种进行枚举就行了

code

//加油
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read()
{
char c=getchar();ll a=0,b=1;
for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1;
for(;c>='0'&&c<='9';c=getchar())a=a*10+c-48;
return a*b;
}
char c[1001];
int n,m,ans=INT_MAX,len,a[10001],q[100001];
void work(int mid)
{
int sum=0,top=0;
for(int j=1;j<=mid;j++)
{
if(top>=1&&a[j]==q[top])sum++;
else
if(top>=2&&a[j]==q[top-1])top--,sum+=2;
else
q[++top]=a[j],sum+=2;
}
for(int j=mid+1;j<=len;j++)
{
while(top&&q[top]!=a[j])sum++,top--;
if(top==0)sum+=2;
sum++;
}
ans=min(ans,sum+top);
}
int main()
{
freopen("letter.in","r",stdin);
freopen("letter.out","w",stdout);
string s;
cin>>s;
for(int i=0;i<s.size();i++)
a[i+1]=s[i]-'A'+1;
len=s.size();
for(int i=1;i<=len;i++)
{
work(i);
}
cout<<ans<<endl;
return 0;
}

至于怎么想到这中做法的,其实还是性质的分析,如果能够想到这种转折点的证明,那么就应该只能够比较顺理成章的想到这种方法。
转折点其实就是关于贡献的一种性质,在思考利用最后的栈中的数的时候应该能够想到。

这种题目我是第一次遇到,栈和字符串的结合。主要还是思考决策的方法,然后对其进行一定的利用。
但是存在特殊的情况的题目比较的常见,想这种字符串只由ABC组成的。还有上次我遇到的线段树的题目,a[i]<1000,操作是求区间的所有的子区间的异或和的和,存在异或这种与只与二进制有关的操作。
都是对于题目特殊性质的应用。

这种就是要去思考这种特殊的性质要什么效果和使用方法就可以想到正解了

一次考试的T3的更多相关文章

  1. [考试反思]0908NOIP模拟测试40:颠簸

    怎么说呢?好像也没什么可说的. 把我的优缺点都表现出来了的一场考试. T3是个小的dp想出来就能打,打出来就能A.我上来过了一遍题目觉得T3最简单(然而也并不是很简单) 然后就开始打,交,其实已经A了 ...

  2. NOIP模(ka)拟(chang)测试30 考试报告

    应得分:300 实得分:210 毒瘤卡常出题人,卡掉90分! T1 Return 开个副本数组sort一下,unique去重就可以啦.时间复杂度$ O(nlog2(n)) $ T2 One 其实就是约 ...

  3. BZOJ2460 [BeiJing2011]元素

    Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石. 一般地,矿石越多则法力越 ...

  4. noip前集训

    10.18 关网了,2333 上午考试,130 rank16 一直在刚T2的割点,却直接弃了一道第一眼看上去不可做但实际并没那么难想的小模拟 但是T2没搞出来是不是也要反思一下,先是割点板子忘了,之后 ...

  5. P3000 [USACO10DEC]牛的健美操Cow Calisthenics

    题目描述 Farmer John continues his never-ending quest to keep the cows fit by having them exercise on va ...

  6. 六省联考2017 Day1

    目录 2018.3.18 Test T1 BZOJ.4868.[六省联考2017]期末考试 T2 T3 BZOJ.4870.[六省联考2017]组合数问题(DP 矩阵快速幂) 总结 考试代码 T1 T ...

  7. 洛谷P3368 树状数组2 树状数组+差分

    正解:树状数组+差分 解题报告: 戳我! 不得不说灵巧真滴是越来越弱了...连模板题都要放上来了QAQ 因为今天考试的T3正解要用到树状数组这才惊觉树状数组掌握得太太太太差了...之前一直靠线段树续着 ...

  8. 最短路【bzoj1726】: [Usaco2006 Nov]Roadblocks第二短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...

  9. CF895 E. Eyes Closed(线段树 期望)

    题意 Sol 今天考试的T3,,我本来留了一个小时去写.但是T2一刚就刚了两个小时 最后也没来的及写.. 然后考完 开始写,,25min就A了.. 感觉自己太高估自己的思维,太低估自己的码力了... ...

  10. NOIP退役记

    10.10 想着自己再过一个月就要退役了,真叫人心酸.想到徐志摩的诗: "悄悄地,我走了,正如我悄悄的来,我挥一挥衣袖,不带走一片云彩." 学了这么久的OI,感觉真的就像诗里讲的一 ...

随机推荐

  1. Prism导航

    通常,导航意味着某个Control被添加到UI中,与此同时另一个Control被移除. 简单跳转 新建 UserControl,新建ViewModel,VM需要实现 INavigationAware ...

  2. 1.5 编写自定位ShellCode弹窗

    在笔者上一篇文章中简单的介绍了如何运用汇编语言编写一段弹窗代码,虽然简易ShellCode可以被正常执行,但却存在很多问题,由于采用了硬编址的方式来调用相应API函数的,那么就会存在一个很大的缺陷,如 ...

  3. 给 Helm 提一个 PR,重温开源项目参与过程

    目录 逛社区 领任务 复现 Bug 用 GPT-4 来准备 Bug 复现材料 对着 GPT-4 给的命令复现 Bug 定位 Bug 修复思路 编写代码 测试 提 PR 逛社区 酒足饭饱,闲来无事,打开 ...

  4. 策略模式+Spring配置类优化多if..else思路

    图示 1. 现状 场景: 假设设备上报不同类型的消息,我们要对不同类型的消息做不同的处理.如果我们通过if..else的方式处理的话会显得比较冗余. 例如: if("alarmEvent&q ...

  5. redis 中的 字符串

    String是redis 中的最基本的类型, 为二进制安全  ,意味着String可以表示各种类型  一个字符串value 最大为 521M set k1 v100 set k2 v200 get 命 ...

  6. pandas去重方法

    原文链接:https://blog.csdn.net/missyougoon/article/details/83926840 数据去重可以使用duplicated()和drop_duplicates ...

  7. WEB前端资源网站推荐

    https://www.bootcss.com/ https://www.bootcdn.cn/ http://www.jeasyui.net/plugins/756.html

  8. 五 Android Capabilities讲解(转)

    1.Capabilities介绍 可以看下之前代码里面设置的capabilities DesiredCapabilities capabilities = new DesiredCapabilitie ...

  9. Hadoop集群启动没有DataNode进程

    问题状况: 问题原因: 在启动Hadoop之前,进行了多次格式化,导致DataNode的ID发生了变化 解决方案: 我们可以删除从节点所有的DataNode资料,并重新格式化 解决流程 1.根据cor ...

  10. 基于redis6搭建集群

    前言 系统版本:CentOS 7 redis版本:redis6.2.4,官方tar.gz包 两台服务器: 172.50.11.11 端口7002.7004.7006 172.50.12.11 端口70 ...