2013年北邮网研院上机真题(C)

来源:互联网 发布:没什么用网络语怎么说 编辑:程序博客网 时间:2024/05/22 03:44


 字符串转换

Accept:78  

  Submit:471

Time Limit:1000MS  

  Memory Limit:65536KB

Description

我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而"abcd"则不是简单串。现在给你一个仅由小写字母组成的字符串,你需要用最小的花费,将其转换成一个简单串。 花费的计算规则如下:将az26个小写字母从左到右排成一排,则每个字母都有左右两个邻居,我们认为a的左邻居是zz的右邻居是a。一个字母只能转换成其相邻的字母,转换的花费为1。一个字母可以进行多次转换,例如将a转换成d,可以进行如下的步骤a->b->c->d,花费为3。字符串的转换花费为所有字母转换花费之和。例如将字符串"abbbz"转换成简单串的最小花费为3,转换后的结果为"bbbbb"

InputFormat

第一行一个整数T(T≤100),表示测试数据的组数。 每组测试数据只有一行,为仅含小写字母的字符串,字符串长度不超过1000

OutputFormat

对于每一组数据,输出一个整数,表示将字符串转换成简单串的最小花费。

SampleInput

2

abbba

abbac

SampleOutput

2

3

# include <stdio.h>  # include <string.h>    int main()  {      int t, l, temp;      int i, j, k;      char str[1002], ch[26];      int n[26];        scanf("%d", &t);        ch[0] = 'a';      for (i = 0; i < 26; i++)          ch[i + 1] = ch[i] + 1;        for (k = 0; k < t; k++)      {          scanf("%s", str);            memset(n, 0, sizeof(n));          l = strlen(str);            for (j = 0; j < 26; j++)          {              for (i = 0; str[i] != '\0'; i++)              {                  if (str[i] == ch[j])                      n[j]++;              }          }            for (i = 0; i < 26; i++)              for (j = 0; j < 26 - i; j++)                  if (n[j + 1] < n[j])                  {                      temp = n[j + 1];                      n[j + 1] = n[j];                      n[j] = temp;                  }            printf("%d\n", l - n[25]);      }      return 0;  }

0 0
原创粉丝点击