之前看了一篇文章讲了一些POJ里可以刷的水题里有这个题,然后一看又是1002,作为一个萌新就来试了试,发现没有想的那么简单。
基本部分就是字符串的遍历操作,以及字符串中的数,和真正数中的数,这个比较基本。
POJ真的很严格!!!最开始调用algorithm中的sort使用了字符串的排序,发现TLE,好吧可能是字符串太慢了,转换成数字后再排序吧。。。还是TLE。。。
根据一些网上AC代码我发现是我在运行中存储了过多无用的东西,例如字符串在输入时就可以转换成数字,然后进入到数组中,而不用先全部输入完成后再统一转,这样就可以降低时间复杂度,猜测这道题测试数据给了一些非常极限的情况,导致这些O(n)的操作可能也对结果产生了影响,还是要说一句,POJ真的很严格!!!
最后输出还有一个%03d %04d的小坑
题目代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
int main() {
int n;
scanf("%d\n",&n);
int number[100010]={0};
int divide;
char ch;
for(int i=0;i<n;i++)
{
divide = 1000000;
ch = getchar();
while(ch!='\n')
{
if(ch=='A'||ch=='B'||ch=='C')
{
number[i] += (2)*divide;
divide/=10;
}
else if(ch=='D'||ch=='E'|ch=='F')
{
number[i] += (3)*divide;
divide/=10;
}
else if(ch=='G'||ch=='H'||ch=='I')
{
number[i] += (4)*divide;
divide/=10;
}
else if(ch=='J'||ch=='K'||ch=='L')
{
number[i] += (5)*divide;
divide/=10;
}
else if(ch=='M'||ch=='N'||ch=='O')
{
number[i] += (6)*divide;
divide /=10;
}
else if(ch=='P'||ch=='R'||ch=='S')
{
number[i] += (7)*divide;
divide/=10;
}
else if(ch=='T'||ch=='U'||ch=='V')
{
number[i] += (8)*divide;
divide/=10;
}
else if(ch=='W'||ch=='X'||ch=='Y')
{
number[i] += (9)*divide;
divide/=10;
}
else if(ch>='0'&&ch<='9')
{
number[i] += (ch-'0')*divide;
divide/=10;
}
ch = getchar();
}
}
sort(number,number+n);//这里的排序已经换成了数字的排序
int flag = 0;
for(int i=0;i<n;i++)
{
int count = 0;
while(number[i]==number[i+1])
{
count ++;
i++;
}
if(count>0)
{
printf("%03d-%04d %d\n",number[i]/10000,number[i]%10000,count+1);
flag = 1;
}
}
if(!flag)
{
printf("No duplicates.\n");
}
return 0;
}