标题:[求助]ACM练习题目
只看楼主
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
得分:0 
麻煩了,發現鏈表的排序是個挺麻煩的問題。
剛才搞了一個多鐘都出不來。

2007-08-17 08:09
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
得分:0 
#include<iostream>
#include<string>
using namespace std;
typedef struct phone
{
string data;
int times;
struct phone *next;
}node;
char change(char one)
{
if(one>='A'&&one<='Z')
{
switch(one)
{
case 'A':
case 'B':
case 'C':
return '2';
break;
case 'D':
case 'E':
case 'F':
return '3';
break;
case 'G':
case 'H':
case 'I':
return '4';
break;
case 'J':
case 'K':
case 'L':
return '5';
break;
case 'M':
case 'N':
case 'O':
return '6';
break;
case 'P':
case 'R':
case 'S':
return '7';
break;
case 'T':
case 'U':
case 'V':
return '8';
break;
case 'W':
case 'X':
case 'Y':
return '9';
break;
}
}
else return one;
}
main()
{
node *head,*pre,*p,*q,*l,*Qpre,*Ppre;
int x,y,z,i,k;
string temp1,temp2;
cout<<"enter a number"<<endl;
cin >>x;
head=new node;
pre=head;
for(i=0;i<x;i++)
{
cin >>temp1;
y=temp1.length();
k=0;
temp2="";
for(z=0;z<y;z++)
{
if(k==3)
{
temp2=temp2+'-';
k++;
}
if(temp1[z]!='-')
{
temp2=temp2+change(temp1[z]);
k++;
}
}
p=new node;
p->data=temp2;
pre->next=p;
pre=pre->next;
}
pre->next=NULL;
cout<<endl<<endl;
pre=head->next;
l=head;
while(pre)
{
temp1=pre->data;
p=pre->next;
q=pre;
k=1;
while(p)
{
if(temp1==p->data)
{
k++;
q->next=p->next;
delete(p);
p=q->next;
}
else
{
p=p->next;
q=q->next;
}
}
if(k>1)
{
pre->times=k;
l=pre;
pre=pre->next;
}
else
{
l->next=pre->next;
delete(pre);
pre=l->next;
}
}
pre=head;
while(pre)
{
p=pre->next;
q=p;
Qpre=Ppre=pre;
while(p)
{
if(p->data<q->data)
{
Qpre=Ppre;
q=p;
p=p->next;
Ppre=Ppre->next;
}
else
{
Ppre=Ppre->next;
p=p->next;
}
}
cout<<q->data<<' '<<q->times<<endl;
Qpre->next=q->next;
delete(q);
pre=pre->next;
}
cout<<head->next->data<<' '<<head->next->times<<endl;
return 0;
}





終于出來了啦。樓主你試試。

2007-08-18 07:50
企鹅
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2006-7-14
得分:0 
不知道为何。你的答案又WA了
这里是这个问题的地址http://acm.pku.edu.cn/JudgeOnline/submit?problem_id=1002
楼主你可以自己去试看看。
你对问题的直琢实在领人佩服。
我是个初学者。交个朋友吧。qq:53988704
2007-08-19 04:55
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
得分:0 
为什么我检测都没有问题
可能是我的程序cout的说明语言实在太少了
enter a number 你输入12 然后 回车
然后复制 粘贴 那12组电话号码 再按回车
就ok了啦

2007-08-19 06:21
bupo
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-8-19
得分:0 

每一次ac都那么激动人心

2007-08-19 16:07
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
得分:0 
樓上的什么意思?

2007-08-19 17:55
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
得分:0 
回复:(企鹅)[求助]ACM练习题目

My ACed verion for PKU1002.
========================================================


#include <iostream>
#include <map>
#include <string>
#include <utility>

using namespace std;

map<string, int> msi;
char s2[9];
bool dup;

char table[27]="22233344455566677778889999";


void convert(const string& s)
{
int i, j=0;
string t;

for(i=0; i<s.size(); ++i)
{
if(j==3)
++j;
if( (s[i]>='A' && s[i]<='P') || (s[i]>='R' && s[i]<='Y'))
s2[j++]=table[s[i]-'A'];
else if(s[i]>='0' && s[i]<='9')
s2[j++] = s[i];
}

s2[3]='-';
s2[8]='\0';

t=s2;
if(msi.find(t)==msi.end())
msi.insert(make_pair(t, 1));
else
{
++msi[string(t)];
dup=true;
}
}

int main()
{
int n, i;
string s;
char str[1000];

while(cin>>n)
{
msi.clear();
dup=false;

for(i=1; i<=n; ++i)
{
//cin>>s;
scanf("%s", str);
s=str;
convert(s);
}

if(!dup)
cout<<"No duplicates."<<endl;
else
{
for(map<string, int>::const_iterator p=msi.begin(); p!=msi.end(); ++p)
{
if(p->second>1)
printf("%s %d\n", p->first.c_str(), p->second);
//cout<<p->first<<" "<<p->second<<endl;
}

}
}

return 0;
}


I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-08-24 01:14
jing0128
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-8-24
得分:0 
回复:(企鹅)[求助]ACM练习题目

这个题在找到对应的号码之后,用快速排序把相同的排在临近的位置,那样搜索的话会快一些.

2007-08-25 11:25
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
换c的io试试!

Fight  to win  or  die...
2007-08-29 00:44
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
得分:0 
以下是引用HJin在2007-8-24 1:14:39的发言:

My ACed verion for PKU1002.
========================================================


#include <iostream>
#include <map>
#include <string>
#include <utility>

using namespace std;

map<string, int> msi;
char s2[9];
bool dup;

char table[27]="22233344455566677778889999";


void convert(const string& s)
{
int i, j=0;
string t;

for(i=0; i<s.size(); ++i)
{
if(j==3)
++j;
if( (s[i]>='A' && s[i]<='P') || (s[i]>='R' && s[i]<='Y'))
s2[j++]=table[s[i]-'A'];
else if(s[i]>='0' && s[i]<='9')
s2[j++] = s[i];
}

s2[3]='-';
s2[8]='\0';

t=s2;
if(msi.find(t)==msi.end())
msi.insert(make_pair(t, 1));
else
{
++msi[string(t)];
dup=true;
}
}

int main()
{
int n, i;
string s;
char str[1000];

while(cin>>n)
{
msi.clear();
dup=false;

for(i=1; i<=n; ++i)
{
//cin>>s;
scanf("%s", str);
s=str;
convert(s);
}

if(!dup)
cout<<"No duplicates."<<endl;
else
{
for(map<string, int>::const_iterator p=msi.begin(); p!=msi.end(); ++p)
{
if(p->second>1)
printf("%s %d\n", p->first.c_str(), p->second);
//cout<<p->first<<" "<<p->second<<endl;
}

}
}

return 0;
}

in my OJ, your source code result:
Name: "HJin" Problem ID "38"
Submit Time: 2007/8/30-02:05

G++: Compile Warning:
Line In function `void convert(const std::string&)':
Line 20: warning: comparison between signed and unsigned integer expressions

Test 1: Accepted Time = 0 ms
Test 2: Accepted Time = 20 ms
Test 3: Time Limit Exceed
────────────────
Problem ID 38
Test Result Time Limit Exceed
Total Time Null
Total Memory 280 Kb
Code Length 1373 Bytes



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

请大家不要用TC来学习C语言
C/C++算法习题(OnlineJudge):[url]http://yzfy.org/[/url]

[此贴子已经被作者于2007-8-30 2:08:31编辑过]

2007-08-30 02:06



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-160833-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.171764 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved