现在的位置: 首页 > 综合 > 正文

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

2018年09月23日 ⁄ 综合 ⁄ 共 950字 ⁄ 字号 评论关闭


 字符串转换

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; 
 }

抱歉!评论已关闭.