一次考试的T3

啊这
感觉不太可做
观察性质,发现这个字符串只由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的更多相关文章
- [考试反思]0908NOIP模拟测试40:颠簸
怎么说呢?好像也没什么可说的. 把我的优缺点都表现出来了的一场考试. T3是个小的dp想出来就能打,打出来就能A.我上来过了一遍题目觉得T3最简单(然而也并不是很简单) 然后就开始打,交,其实已经A了 ...
- NOIP模(ka)拟(chang)测试30 考试报告
应得分:300 实得分:210 毒瘤卡常出题人,卡掉90分! T1 Return 开个副本数组sort一下,unique去重就可以啦.时间复杂度$ O(nlog2(n)) $ T2 One 其实就是约 ...
- BZOJ2460 [BeiJing2011]元素
Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石. 一般地,矿石越多则法力越 ...
- noip前集训
10.18 关网了,2333 上午考试,130 rank16 一直在刚T2的割点,却直接弃了一道第一眼看上去不可做但实际并没那么难想的小模拟 但是T2没搞出来是不是也要反思一下,先是割点板子忘了,之后 ...
- P3000 [USACO10DEC]牛的健美操Cow Calisthenics
题目描述 Farmer John continues his never-ending quest to keep the cows fit by having them exercise on va ...
- 六省联考2017 Day1
目录 2018.3.18 Test T1 BZOJ.4868.[六省联考2017]期末考试 T2 T3 BZOJ.4870.[六省联考2017]组合数问题(DP 矩阵快速幂) 总结 考试代码 T1 T ...
- 洛谷P3368 树状数组2 树状数组+差分
正解:树状数组+差分 解题报告: 戳我! 不得不说灵巧真滴是越来越弱了...连模板题都要放上来了QAQ 因为今天考试的T3正解要用到树状数组这才惊觉树状数组掌握得太太太太差了...之前一直靠线段树续着 ...
- 最短路【bzoj1726】: [Usaco2006 Nov]Roadblocks第二短路
1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...
- CF895 E. Eyes Closed(线段树 期望)
题意 Sol 今天考试的T3,,我本来留了一个小时去写.但是T2一刚就刚了两个小时 最后也没来的及写.. 然后考完 开始写,,25min就A了.. 感觉自己太高估自己的思维,太低估自己的码力了... ...
- NOIP退役记
10.10 想着自己再过一个月就要退役了,真叫人心酸.想到徐志摩的诗: "悄悄地,我走了,正如我悄悄的来,我挥一挥衣袖,不带走一片云彩." 学了这么久的OI,感觉真的就像诗里讲的一 ...
随机推荐
- Blazor中CSS隔离无法用在子组件内部
Blazor的CSS隔离是个很好的东西,如图,只需添加一个与Razor组件同名的CSS文件,这个文件中的CSS样式只会在同名的Razor组件中使用. 原理是通过在dom元素添加一个代表标识符的属性 在 ...
- 2021-7-6 new tcpip
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Ne ...
- jsp中的一些问题
jsp里的${pageContext.request.contextPath} 在JSP中,${pageContext.request.contextPath}是一个EL表达式(Expression ...
- 如何在CMD窗口运行python文件
进入文件所在的路径输入: python 文件名
- Visual Studio常用快捷键(附带免费PDF)
前言 对于开发者而言,熟悉快捷键的使用,能够起到事半功倍的作用,提高工作效率.以下是我整理的一份Visual Studio常用快捷键清单,希望能够帮助到你. 常用快捷方式 快捷键 功能 Ctrl + ...
- 用 Tensorflow.js 做了一个动漫分类的功能(一)
前言: 浏览某乎网站时发现了一个分享各种图片的博主,于是我顺手就保存了一些.但是一张一张的保存实在太麻烦了,于是我就想要某虫的手段来处理.这样保存的确是很快,但是他不识图片内容,最近又看了 mobil ...
- [Python]数组基础
在python中,一般使用列表表示数组.例如: 一维数组 arr1 = [1,2,3,4] 二维数组 arr2 = [[1,2,3,4],[5,6,7,8]] 数组的常用操作 追加 利用append( ...
- .NET Core多线 (5) 常见性能问题
合集:.NET Core多线程温故知新 .NET Core多线程(1)Thread与Task .NET Core多线程(2)异步 - 上 .NET Core多线程(3)异步 - 下 .NET Core ...
- Anaconda+PyCharm+Pytorch/tensorflow环境配置个人总结
Anaconda是一个非常方便的python版本管理工具,可以很方便地切换不同版本的Python进行测试.同时不同版本之间也不存在相互的干扰. PyCharm是一款常见的Python IDE,pyto ...
- 《Kali渗透基础》11. 无线渗透(一)
@ 目录 1:无线技术 2:IEEE 802.11 标准 2.1:无线网络分层 2.2:IEEE 2.3:日常使用标准 2.3.1:802.11 2.3.2:802.11b 2.3.3:802.11a ...