中南大学2012年8月月赛 C题 Caps Lock 模拟

1093: Caps Lock

Time Limit: 1 Sec  Memory Limit: 16 MB
SUBMIT: 216  Solved: 45
[SUBMIT] [STATUS]

Description

GBQC国的小明当上了打字员,现在他需要打出N篇只含字母的文章,小明习惯用Caps Lock键来转换大小写,因此每当从小写字母转换成大写字母的时候,他就会按一下Caps Lock键打开大写锁,每当从大写字母转换成小写字母的时候,他就会按一下Caps Lock键关闭大写锁。

在最初的时候大写锁是关闭的,小明的打文章的顺序可以是任意的,但对于任意一篇文章必须从文章开头至结尾逐一打完每个字母,中途不能更换其他文章。

现在小明想知道,如何安排打文章的顺序才能使按Caps Lock键的次数最少呢?

Input

输入包含多组测试数据。

对于每组测试数据,第一行包含一个整数N(1<=N<=10^3),表示小明一共要打N篇文章,接下来一共有N行,每行均包含1-100个大写或小写字母,分别描述了这N篇文章。

Output

对于每组测试数据,用一行输出一个整数,表示小明打完这N篇文章至少按Caps Lock键多少次。

Sample Input

1ABCde1fgHIJ2ABCdefgHIJ

Sample Output

212

HINT

    如果使用ctype.h下的函数请注意服务器上isupper()、islower()等函数尽管条件为假时会返回0,但条件为真时返回值不一定为1。


    由于数据量较大,推荐使用scanf和printf。

Source

CSU Monthly 2012 Aug.


下面是标程  由于现在csu 没办法交题  现在先保存下来  等能交题了 再去做   


思路:

其实   可以按头尾分为  11 10 01 00    0是小写  1是大写   从第2个字符到最后一个 如果当前字符不等于前一个的大小 就加+1

之后只要考虑头和结尾 如果一个串的尾和一个串的头相同则不用替换大小写     这样 根据几组例子可以发现  只要把00放到最前之后是01 1后放11(所有的11)即先把所有的00直接搞定  之后如果有01则放01  1后面把所有的11 放完  这样这些都不用替换大小写  只要比较01 10的个数差即可 根据其个数差具体分析   


经验: 这个题目让我深刻认识到   对于这类模拟题 必须要动手      一定要动手多写几组数据 不要怕麻烦 这种题只能根据自己写的数据 才能发现其中的秘密

必须要多些几组数据 去研究  不要怕麻烦


/*
两端分为大大、大小、小大、小小四种,大大和小小都可并入小大、大小,所以分析小大、
大小两种的个数关系即可。 
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char buf[111];
int kind[2][2];
inline bool isbig(char x)
{return x <= 'Z';}
int main()
{
	int n, i, j, cnt;
	while(scanf("%d", &n) != EOF)
	{
		cnt = 0;memset(kind, 0, sizeof(kind));
		while(n --)
		{
			scanf("%s", buf);
			for(i = 1; buf[i]; ++ i)
				cnt += isbig(buf[i]) != isbig(buf[i - 1]);
			++ kind[isbig(buf[0])][isbig(buf[strlen(buf) - 1])];
		}
		printf("%d\n",cnt);
		if(!kind[0][1]&&!kind[1][0] && kind[1][1]) ++ cnt; 
		if(kind[0][1] > kind[1][0] + 1) cnt += kind[0][1] - kind[1][0] - 1;
		else if(kind[0][1] < kind[1][0]) cnt += kind[1][0] - kind[0][1];
		printf("%d\n", cnt);
	}
	return 0;
}



你可能感兴趣的:(c,服务器,测试,input,output)