487--3279 UVA 755 其实有三种解法

说说:这道题初看挺简单的,题意无非就是将一串字符转化成一个用‘-’隔开的电话号码,然后把出现超过一次的号码按照字典升序输出即可。但是这样样做是会超时的....其实把电话号码中间的‘-’去掉,电话号码其实就是一个整数,有了这个想法那就简单啦。只要设立一个超大的数组包含所有可能的电话号码,然后数组的值是该号码出现的次数,统计完后遍历一遍输出即可。但是第三种相当于把前两种方法法结合起来了。把号码当成一个整数,但是号码存储在一个数组中,号码出现的次数存储在另一个数组中。这样在插入新号码的时候就排序,然后就超时了。总的来说,不能排序,因为数据量比较大,最后肯定会超时的。

题目:

487--3279

Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or phrase. For example,

商务人士都喜欢容易记住的电话号码。让号码听起来像一个易记的单词或短语是一种很好的方法。

you can call the University of Waterloo by dialing the memorable TUT-GLOP. Sometimes only part of the number is used to spell a word. When you get back to your hotel

比如你打Waterloo大学的电话就拨TUT-GLOP。有时只有一部分的数字用于组成一个单词。当你在今天晚上回到你的酒店的时候

tonight you can order a pizza from Gino‘s by dialing 310-GINO. Another way to make  a telephone number memorable is to group the digits in a memorable way. You

你可以拨打310-GINO从GION预订披萨。另一种让电话号码易记的方法是用一种易记的方式组织数字。

could order your pizza from Pizza Hut by calling their ``three tens‘‘ number 3-10-10-10.

你可以从PIZZA HUT预订披萨通过拨打三个十------  3-10-10-10

The standard form of a telephone number is seven decimal digits with a hyphen between the third and fourth digits (e.g. 888-1200). The keypad of a phone supplies the

标准的电话号码形式是七个十进制数,并且在第三个和第四个数之间有一个连字符(例如:888-1200).一个手机的键盘提供了一种从字母到数字的映射

mapping of letters to numbers, as follows:

如下所示:

A, B, and C map to 2

D, E, and F map to 3

G, H, and I map to 4

J, K, and L map to 5

M, N, and O map to 6

P, R, and S map to 7

T, U, and V map to 8

W, X, and Y map to 9

There is no mapping for Q or Z. Hyphens are not dialed, and can be added and removed as necessary.The standard form of TUT-GLOP is 888-4567, the standard form of

其中并没有到Q或Z的映射。连字符在拨号时不必使用,在必要的时候可用可不用。TUT-GLOP的标准形式是888-4567,310-GINO的标准形式是310-4466,3-10-10-10的标准形

310-GINO is 310-4466, and the standard form of 3-10-10-10 is 310-1010.

式是310-1010.

Two telephone numbers are equivalent if they have the same standard form. (They dial the same number.)

如果两个电话号码有同样的标准形式,那么它们就是完全等价的。

Your company is compiling a directory of telephone numbers from local businesses. As part of the quality control process you want to check that no two (or more)

你的公司现在正在编写一部关于本地商业信息的电话号码本。作为质量控制,你现在要确保在电话本中没有两个(或更多)的电话是一样的。

businesses in the directory have the same telephone number.

INPUT

The first line of the input contains the number of data sets in the input. A blank line follows. The first line of each data set specifies the number of telephone numbers in the

第一行的输入是输入数据集的个数。接下来会有一个空白行。每个输入数据集的第一行是一个正数,指明了电话本中电话号码的数目(最大为100,000)。

directory (up to 100,000) as a positive integer alone on the line. The remaining lines list the telephone numbers in the directory, with each number alone on a line. Each

接下来每一行是电话本中的一个号码。

telephone number consists of a string composed of decimal digits, uppercase letters (excluding Q and Z) and hyphens. Exactly seven of the characters in the string will be

每个电话号码由十进位数字,大写字母(除了Q和Z)以及连字符组成且数字和字母的总数刚好是七个。

digits or letters. There‘s a blank line between data sets.

每个数据集直接有一个空行。

OUTPUT

Generate a line of output for each telephone number that appears more than once in any form. The line should give the telephone number in standard form, followed by a

首先将那些以任何形式出现过一次以上的电话号码以标准形式输出,并且接下来输出一个空格,接着输出电话号码在电话本中出现的次数。

space, followed by the number of times the telephone number appears in the directory. Arrange the output lines by telephone number in ascending lexicographical order. If

而且输出的电话号码必须按字典升序输出。

there are no duplicates in the input print the line:

如果没有重复的电话号码则输出:

No duplicates.

Print a blank line between data sets.

在数据集的输出直接输出一行空行。

SAMPLE INPUT

1

12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279

SAMPLE OUTPUT

310-1010 2
487-3279 4
888-4567 3

源代码:

解法2:(AC过的,但还是要600多毫秒= =)

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXN 10000000+5

int tel[MAXN];//数组下标是电话号码,数组值是下标对应的号码出现的次数
int N,M,count;
char new_tel[50];

int to_standard(char*);//电话转化为数字
char AtoD(char);//字母转化为数字

int main(){
 int i,pos,val;

// freopen("data","r",stdin);
 scanf("%d",&M);

 while(M--){
  scanf("%d",&N);
  count=0;
  memset(tel,0,sizeof(tel));
  for(i=0;i<N;i++){

   scanf("%s",new_tel);
   val=to_standard(new_tel);
   if(tel[val]==0)//号码未出现过
    count++;

   tel[val]++;
  }

  if(count==N)//号码每个都不同
   printf("No duplicates.\n");
  else
   for(i=0;i<MAXN;i++)
    if(tel[i]>1)
     printf("%03d-%04d %d\n",i/10000,i%10000,tel[i]);
   if(M) putchar('\n');
 }

 return 0;
}

int to_standard(char *new_tel){//字符号码转化为整数值
 int i=0;
 int val=0;

 while(new_tel[i]){
  if(isdigit(new_tel[i]))
   val=val*10+new_tel[i++]-'0';
  else if(new_tel[i]=='-'){
   i++;
   continue;
  }
  else
   val=val*10+AtoD(new_tel[i++])-'0';
 }

 return val;
}

char AtoD(char c){//字母转化为数字

 if(c>'Q')
 c--;

 return '2'+(c-'A')/3;
}

为了保证文章的长度,另外两种方法就不贴代码啦。嘿嘿~

487--3279 UVA 755 其实有三种解法,布布扣,bubuko.com

时间: 2024-10-26 13:19:25

487--3279 UVA 755 其实有三种解法的相关文章

uva 755

题目 Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or phrase. For example, you can call the University of Waterloo by dialing the memorable TUT-GLOP. Sometimes onl

Uva 755 487-3125

分析: 这道题是刘汝佳灰书上所给的一道题.题目很简单,就是处理字符串并排序输出.但我却卡了很久,试了很多不同的方式,至今使用字符串的一个还没有调试出来.POJ 1002是一道几乎相同的题(不过没有多组数据). 注意事项: 1. 数据量很大,最好不用cin/cout(当然也可以取消std::同步). 2. 每个电话号码的初始输入可能很长. 3. 号码长度不够时要补0. //用整数处理字符串(UVa已过)#include<iostream> #include<cstdio> #incl

uva 755 - 487--3279

1 #include <iostream> 2 #include <string> 3 #include <map> 4 #include <algorithm> 5 #include <cstdio> 6 #include <cctype> 7 using namespace std; 8 9 const char kTable[] = "2223334445556667Q77888999Z"; 10 int m

uva 755 (487--3279)排序

这是一简单的排序,之所以把这道题放上面呢,是因为我在这道题上实在wa太多了,wa了7次,中间找出来 个错误,就是在倒数第一个和倒数第二个相等的情况下我没有输出他们的个数,改正后还是wa,最后我发现原来是每组 数据之间输出一个空行.....坑了我好久,一直以为是每组后面都有空行... 放代码: #include<stdio.h> #include<stdlib.h> #include<string.h> //char a[100005]; char a[100005][1

Volume 1. Elementary Problem Solving :: Sorting/SearchingUva 340,10420,10474,152,299,120,156,400,755

刘汝佳 算法入门 第一版 Uva题目集合(四) Uva 340 #include<stdio.h> #include<string.h> int h[1001][2],g[1001]={0}; int n,m=0,i,j,k,a,b,o; int main() { #ifndef ONLINE_JUDGE freopen("input.txt","r",stdin); freopen("output.txt","

小白书练习题5.5.3 排序检索类、

UVA 340 Master-Mind Hints 题意:猜数字游戏,给n个数的序列给你.接下来一行是答案序列.剩下的都是猜测序列.对于每一个猜测序列,统计有多少个数字相同并且位置相同.有多少数字相同位置不同.每一个数字只能用一次. 思路:直接统计可以求出数字相同并且位置相同的哪一些数.在此过程中我加了一个标记数组.标记那些用过的数的位置为1,没用过为0:然后枚举猜测中哪些没用过的数字.去答案序列中找.当数字相等并且答案行中那个数也没用过时.计数加1: 1 #include<cstdio> 2

lua协程一则报错解决“attempt to yield across metamethod/C-call boundary”

问题 attempt to yield across metamethod/C-call boundary 需求跟如下帖子中描述一致: http://bbs.chinaunix.net/forum.php?mod=viewthread&action=printable&tid=4065715 模拟一个场景,在C中创建出coroutine来执行Lua脚本,并且提供C API给Lua使用,当某些操作可能会阻塞时(如网络I/O),C函数中执行yield将协程切换出去,然后未来的某个时刻,如果条件

maximum sum

uva,10684 1 #include <iostream> 2 #include <cstdio> 3 #define maxn 10005 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 int a[maxn]; 10 while(scanf("%d",&n),n) 11 { 12 for(int i=0;i<n;i++) 13 scanf("%d",&a[

《统计学习方法》:EM算法重点学习以及习题。

适用场景:有隐变量的时候特别适用. EM算法主要分为两个步骤:E步和M步. 输入:选择参数的初值theta,进行迭代. E步: 每次迭代改变初值.定义Q函数.Q函数为迭代的期望值. M步: 求使E步得到的Q函数最大的theta值. 最后,重复进行E步和M步.直到最终theta值变化较小,即为收敛为止. 注意:初值为算法的选择尤为重要.初值的选择会影响结果. EM算法得到的估计序列能够最终收敛得到结果.但是收敛得到的结果并不能保证能够收敛到全局最大值或者局部最大值. EM算法在两个方面极其有用:在