11363: 【原1363】changechange
题目
题目描述
author: yuan 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/1363
题目描述
我记录下自己的每一天,用一个特别而有意义的方式。
如果这一刻我很无助,很愤怒,很不甘心,我就在记忆中写下一个大写字母。
如果这一刻我很快乐,很坚定,并且充满信念,我会轻轻刻下一个小写字母存在的痕迹。
我记了好长好长的时间。
终于有一天,我试图离开与改变。
首先,我要借着直觉心修改这一段带着韵律,跌宕起伏的字符。
我想寻找一个生命中重要的时间点。
在这以前,是郁郁寡欢的无知,是物质的生活,是大写字母。
在这以后,是没有条件的快乐,是心灵的感知,是小写字母。
我可以修改每一个字母,以我想要他们变成的任何形式。但是每次修改,都是对我记忆的残酷的冲击。
现在我累了,所以我想使得修改的次数最少。
现在我累了,我不想想任何事情,我也没有必要要去想这件事情。
但你不一样,你必须帮我想。那你就想想呗。
输入说明
输入一个字符串。
输出说明
输出一个整数表示最小修改次数。
样例输入1
PRuvetSTAaYA
样例输出1
5
样例输入2
OYPROSTIYAOPECHATALSYAPRIVETSTASYA
样例输出2
0
样例输入3
helloworld
样例输出3
0
数据范围
对于50%的数据,1<=字符串长度<=1000;
对于100%的数据,1<=字符串长度<=100000;
yyong119's solution
#include <iostream>
#include <cstring>
#define MAX_LEN 100010
#define min(x, y) ((x) < (y) ? (x) : (y))
using namespace std;
char str[MAX_LEN], ch;
int prev_low[MAX_LEN], fol_up[MAX_LEN];
int ans, n;
int main() {
// input
ios::sync_with_stdio(false);
cin >> str;
n = strlen(str);
// init
for (register int i = 1; i <= n; ++i)
prev_low[i] = prev_low[i - 1] + (str[i - 1] >= 'a');
for (register int i = n - 1; i >= 0; --i)
fol_up[i] = fol_up[i + 1] + (str[i] < 'a');
// find minimun
ans = 0x7fffffff;
for (register int i = 0; i <= n; ++i)
ans = min(ans, prev_low[i] + fol_up[i]);
cout << ans << "\n";
return 0;
}