UVA - 10602 Editor Nottoobad

来源:互联网 发布:网络文明传播志愿小组 编辑:程序博客网 时间:2024/05/29 16:54

题目大意:给出一系列单词,可以重复上一个单词、删除单词尾部字母、键入字母,每键入一个字母算按键盘一次,别的操作不记数,第一个单词必须先输入,剩余单词顺序可随意,问输入这些单词最少需要按多少次键盘。
解题思路:因为允许重复上一个单词和删除尾部字母,那么当前单词和上一个单词的前缀最相似的情况下,键入次数会最少,按照这个思路去排序,然后统计一下不同的字母个数就是答案。

#include<iostream> #include<cstdio>#include<cmath>#include<string.h>#include<stdlib.h>#include<algorithm>#include<queue>using namespace std;char str[110][110];int ans, T, N;void fun() {    int len, len1, len2, tag, tmp, Max;    char s[110];    for (int i = 0; i < N; i++) {        len1 = strlen(str[i]);        Max = 0;        tag = i+1;        for (int j = i+1; j < N; j++) {            len2 = strlen(str[j]);            len = len1 > len2 ? len2 : len1;            tmp = 0;            for (int k = 0; k < len; k++)                if (str[i][k] == str[j][k]) tmp++;                else break;            if (tmp > Max) {                Max = tmp;                tag = j;            }        }        if (tag != i+1) {            strcpy(s, str[i+1]);            strcpy(str[i+1], str[tag]);            strcpy(str[tag], s);        }    }}int main() {    scanf("%d", &T);    while (T--) {        memset(str, 0, sizeof(str));        scanf("%d", &N);        for (int i = 0; i < N; i++) {            scanf("%s", str[i]);        }        fun();        int ans = strlen(str[0]);        for (int i = 1; i < N; i++) {            int t = 0;            for (int j = 0; j < strlen(str[i-1]); j++)                if (str[i][j] == str[i-1][j]) t++;                else break;            ans += strlen(str[i]) - t;        }        printf("%d\n", ans);        for (int i = 0; i < N; i++)            printf("%s\n", str[i]);    }    return 0;}
0 0
原创粉丝点击