[NOIP2017模拟]change
来源:互联网 发布:湖南辉达 知乎 编辑:程序博客网 时间:2024/06/11 20:12
题目背景
SOURCE:NOIP2015-SHY-8
题目描述
我认为一个优美的字符串的任何大写字母总是在所有小写字母的前面。现在,请修改给定的字符串,使得它变得完美。
文章的字符保证是大写字母或小写字母,一次操作定义为把一个大写字母改成小写字母,或把一个小写字母改成大写字母。请求出最小操作次数。
输入格式
输入一个字符串。
输出格式
输出一个值表示最小操作次数。
样例数据
输入
PRuvetSTAaYA
输出
5
备注
【样例说明】
aim string = PRuvetSTAaYA -> PRUVETSTAAYA
【数据范围】
对 50% 的输入数据 :1≤字符串长度≤1000
对 100% 的输入数据 :1≤字符串长度≤100000
分析:这是一道脑残题,只需扫一遍断点,前面小写改成大写,后面大写改成小写,比较出最小值就可以了。
代码
我之前更脑残,认为从前往后扫一遍统计需要改多少个小写字母,再从后往前扫一遍统计需要改多少个大写字母,这样相当于只改大写或小写,居然在脑残数据下能过80%……
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>#include<queue>#include<set>using namespace std;int getint(){ int sum=0,f=1; char ch; for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar()); if(ch=='-') { f=-1; ch=getchar(); } for(;ch>='0'&&ch<='9';ch=getchar()) sum=(sum<<3)+(sum<<1)+ch-48; return sum*f;}char s[100010];int len,cnt[3],num[3];bool bj;int main(){ freopen("change.in","r",stdin); freopen("change.out","w",stdout); scanf("%s",s+1); len=strlen(s+1); if(s[1]>='a'&&s[1]<='z') { bj=0; cnt[0]++; } else bj=1; for(int i=2;i<=len;++i) { if(bj==0) { if(s[i]>='a'&&s[i]<='z') cnt[0]++; else { num[0]+=cnt[0]; cnt[0]=0; bj=1; } } else { if(s[i]>='a'&&s[i]<='z') { cnt[0]++; bj=0; } } } if(s[len]>='A'&&s[len]<='Z') { bj=1; cnt[1]++; } else bj=0; for(int i=len-1;i>=1;--i) { if(bj==0) { if(s[i]>='A'&&s[i]<='Z') { cnt[1]++; bj=1; } } else { if(s[i]>='A'&&s[i]<='Z') cnt[1]++; else { num[1]+=cnt[1]; cnt[1]=0; bj=0; } } } cout<<min(num[0],num[1])<<'\n'; return 0;}
正解
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>#include<queue>#include<set>using namespace std;int getint(){ int sum=0,f=1; char ch; for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar()); if(ch=='-') { f=-1; ch=getchar(); } for(;ch>='0'&&ch<='9';ch=getchar()) sum=(sum<<3)+(sum<<1)+ch-48; return sum*f;}char s[100010];int len,tot0,tot1,cnt,ans;int main(){ freopen("change.in","r",stdin); freopen("change.out","w",stdout); scanf("%s",s+1); len=strlen(s+1); for(int i=1;i<=len;++i) if(s[i]>='a'&&s[i]<='z') tot0++; else tot1++; ans=min(tot0,tot1);//注意边界,按这种方法是没法判断就改小写和就改大写的情况 for(int i=1;i<len;++i) { if(s[i]>='a'&&s[i]<='z') cnt++; ans=min(ans,cnt*2-i+tot1);//后面这个式子就是前面改多少小写后面改多少大写的化简 } cout<<ans<<'\n'; return 0;}
本题结。
阅读全文
0 0
- [NOIP2017模拟]change
- NOIP2017模拟赛1
- NOIP2017模拟赛8
- NOIP2017模拟赛9
- [NOIP2017模拟]切蛋糕
- [NOIP2017模拟]随机图
- [NOIP2017模拟]能源
- [NOIP2017模拟]电影
- [NOIP2017模拟]鸭舌
- [NOIP2017模拟]permut
- [NOIP2017模拟]beautiful
- [NOIP2017模拟]路径
- [NOIP2017模拟]流
- [NOIP2017模拟]subset
- [NOIP2017模拟]hello
- [NOIP2017模拟]table
- [NOIP2017模拟]board
- NOIP2017模拟(7.17)
- 重新开始的程序猿之路
- 本次考试总结(2017.9.16考试)
- 模拟考试 9.16 (期望dp)
- 安装centos系统后启用未使用的磁盘并且分区挂载
- Xstream将对象转换成xml出现乱码问题
- [NOIP2017模拟]change
- 关于VS2017中编写程序的一些问题
- POJ1002-487-3279
- 【PAT】【Advanced Level】题解目录(按年份整理)
- 软件工程中的日志打印总结
- redis | 键的命令
- 关于 Cannot create __weak reference in file using manual reference counting及配置ReactiveCocoa
- Python安全小工具之计算文件Hash值
- CentOS 6.3配置PPTP VPN的方法