POJ 1002
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1002相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=1002
可能的WA点, 我当时错懵逼了, 在把可能的原因都处理了:
1."No duplicates."的拼写, 注意 ‘.‘ 的存在;
2.若用字符串存储,字符串开大点, 最好是30以上,我为了保险, 开了200;
3.据说要处理字母 ‘Q‘, ‘Z‘!? 从其他大牛的博客里看到的;
4.据说cin, cout会有错误/超时!? 所以改用 scanf, printf;
5.提交时, 选择C++会WA, 而G++就通过, 懵逼 X N....
超时:
1.同上4.
2.排序写的不好(原本快排一次码成功挺开心的,没想到超时, 只好用了内置sort)
接下来, 我的懵逼历程:
先上图
上我改进后的代码:
尽管看过网上大牛们的精简代码, 还是斗胆把自己的烂代码丢了出来,
不足:trans()写的太繁琐, 手写的快排会超时....
1 #include <iostream> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #include <cstdio> 6 using namespace std; 7 8 int n; 9 char s[150 + 2]; 10 int num[100000 + 2]; 11 12 int trans(char c, int &bits) 13 { 14 if(c == ‘-‘) return 0; 15 bits++; 16 if(c >= ‘0‘ && c <= ‘9‘) return c - 48; 17 else if(c >= ‘A‘ && c <= ‘C‘) return 2; 18 else if(c >= ‘D‘ && c <= ‘F‘) return 3; 19 else if(c >= ‘G‘ && c <= ‘I‘) return 4; 20 else if(c >= ‘J‘ && c <= ‘L‘) return 5; 21 else if(c >= ‘M‘ && c <= ‘O‘) return 6; 22 else if(c >= ‘P‘ && c <= ‘S‘ && c != ‘Q‘) return 7; 23 else if(c >= ‘T‘ && c <= ‘V‘) return 8; 24 else if(c >= ‘W‘ && c <= ‘Y‘) return 9; 25 } 26 27 bool cmp(int a, int b) {return a < b;} 28 29 void tran_print(int temp) 30 { 31 for(int i = 7; i >= 1; i--) 32 { 33 if (i == 4) printf("-"); 34 printf("%d", temp / (int)pow(10.0, i - 1)); 35 temp = temp % (int)pow(10.0, i - 1); 36 } 37 } 38 39 int main() 40 { 41 scanf("%d", &n); 42 for(int i = 1; i <= n; i++) 43 { 44 scanf("%s", &s); 45 int bits = 0; 46 for(int r = strlen(s) - 1; r >= 0; r--) 47 num[i] += trans(s[r], bits) * (int)pow(10.0, bits - 1); 48 } 49 50 sort(num + 1, num + n + 1, cmp); 51 52 int number = 1; 53 bool flag = false; 54 55 for(int i = 2; i <= n; i++) 56 { 57 if (num[i - 1] == num[i]) number++, flag = true; 58 if((num[i - 1] != num[i] || i == n) && number != 1) 59 tran_print(num[i - 1]), printf(" %d\n", number), number = 1; 60 } 61 if(!flag) printf("No duplicates.\n"); 62 63 return 0; 64 }
以上是关于POJ 1002的主要内容,如果未能解决你的问题,请参考以下文章