两道codeforce的题:
第一道题是将一个字符串的左边变成大写,右边变成小写需要最小的操作数,
我们先预处理出第一个到第i个字符有多少大写字母up[i],第n个到第i个有多
少个小写字母low[i]。假设我们是i左边都是大写,右边都是小写,我们操作
数就是将左边的小写变成大写,右边的大写变成小写,操作数为
i – up[i] + ls – i – low[i],整理下就是 ls – up[i] – low[i],遍历一遍找到最小值即可。
/*Accepted 30 ms 2200 KB */ #include<cstdio> #include<cstring> #include<cstdlib> #include<ctype.h> #define MAXN 100005 #define min( a, b) ( a < b ? a : b) char s[MAXN]; int up[MAXN], low[MAXN], mini, cnt; int main() { while( scanf( "%s", s + 1) == 1) { cnt = 0; mini = MAXN; int ls = strlen(s + 1); for( int i = 1; s[i]; i ++) { if( isupper( s[i])) cnt ++; up[i] = cnt; } cnt = 0; for( int i = ls; s[i]; i --) { if( islower( s[i])) cnt ++; low[i] = cnt; } int i; if( up[ ls] == 0 || low[1] == 0) mini = 0; else { for( int i = 1; s[i]; i ++) { int c = ls - up[i] - low[i]; mini = min( mini, c); } } printf( "%d\n", mini); } return 0; }
第二道题更容易些,a[x] = i ; 记录第三天编号为x的笔记本在第i个人手中,那么
按照规则第四天编号为x的笔记本应该在p[i]手中,即谁拿了x笔记本,a[x]对应
的就是其好朋友的编号。
/*Accepted 130 ms 1700 KB */ #include<cstdio> #include<cstring> #include<cstdlib> #define MAXN 100005 int n; int a[MAXN], x; void init() { for( int i = 1; i <= n; i ++) { scanf( "%d", &x); a[x] = i; } } int main() { while( scanf( "%d", &n) == 1) { init(); for( int i = 1; i < n; i ++) { scanf( "%d", &x); printf( "%d ", a[x]); } scanf( "%d", &x); printf( "%d\n", a[x]); } return 0; }