程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVA 10602 Editor Nottoobad(貪心)

UVA 10602 Editor Nottoobad(貪心)

編輯:C++入門知識

Problem C
EDITOR NOTTOOBAD
 

Company Macrohard has released it’s new version of editor Nottoobad, which can understand a few voice commands. Unfortunately, there are only two voice commands that it can understand – “repeat the last word”, “delete the last symbol”. However, when one uses “repeat the last word” the editor inserts a blank that separates the words. But the company claims that it is possible to type much faster – simply by less number of presses. For example, such a phrase like “this thin thing” requires only 6 presses of the keyboard.

 

Action
 Number

of presses
 Content of the document
 
Press "this"
 4
 This
 
Say “repeat the last word”
 0
 this this
 
Say “delete the last symbol”
 0
 this thi
 
Press "n"
 1
 this thin
 
Say “repeat the last word”
 0
 this thin thin
 
Press "g"
 1
 this thin thing
 

 

In order to increase the popularity of it’s product the company decided to organize a contest where the winner will be a person who types a given number of words with minimum number of presses. Moreover, the first word must be typed first, and all the others can be typed in arbitrary order. So, if words “apple”, “plum” and “apricote” must be typed, the word “apple” must be typed first, and the words “plum” and “apricote” can be switched. And the most important for you – you are going to take part in the contest and you have a good friend in the company, who told you the word which will be used in the contest. You want be a winner J, so you have to write a program which finds the order of the words, where the number of presses will be minimum.

 

Input
The first line of the input contains the T (1≤T≤15) the number of test cases. Then T test cases follow. The first line of each test contains a number N (1≤N≤100) – the number of words that must be pressed. Next N lines contain words – sequences of small Latin letters, not longer than 100 symbols. Remember that the first word must be pressed first!

 

Output
The first line of the output contains number X - the minimum number of presses, which one has to do in order to type all the words using editor Nottoobad. Next N lines contain the words in that minimum order. If there are several solutions, you can output one of them.

 

 

 

 

 

Sample Input
 Sample Output
 
3

3

this

thin

thing

4

popcorn

apple

apricote

plum

2

hello

hello
 6

this

thin

thing

21

popcorn

plum

apricote

apple

5

hello

hello


 
題意:有一台聲控機。有兩種操作。復制單詞和刪除最後一個。要求出所需最少的按鍵操作打出所有單詞。。


思路:貪心。。按字典序排列。。盡量去使用聲控機。就可以減少按鍵次數。。每次保留前面相同的前幾個字符。。然後後面的單詞用聲控機刪除掉。剩下不同的單詞用按鍵去按。。這樣做按鍵操作是最少的。


代碼:


 

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int t, n, sum;
char ci[105][105];

int cmp(const void *a, const void *b) {
    return strcmp((char*) a, (char*) b);
}
int main() {
    scanf("%d", &t);
    while (t --) {
	sum = 0;
	memset(ci, 0, sizeof(ci));
	scanf("%d", &n);
	getchar();
	for (int i = 0; i < n; i ++)
	    gets(ci[i]);
	qsort(ci, n, sizeof(ci[0]), cmp);
	sum = strlen(ci[0]);
	for (int i = 1; i < n; i ++) {
	    int len;
	    for (len = 0; len < strlen(ci[i]); len ++) {
		if (ci[i - 1][len] != ci[i][len])
		    break;
	    }
	    sum += strlen(ci[i]) - len;
	}
	printf("%d\n", sum);
	for (int i = 0; i < n; i ++)
	    printf("%s\n", ci[i]);
    }
    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved