POJ 1002 电话号码排序查重
2014-09-18 22:03
155 查看
487-3279
电话号码除了数字,还有大写字母如下表对应
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
电话号码需要排序,因此可存入int型数组a,数组大小可根据输入的电话数量num来声明
以字符串形式输入至s中,输入与电话号码的对应关系可通过计算得到,代码如下
可以先排序,再查重,此时相同的排在相邻位置;也可以先查重,将多余的去掉后再排序。
排序用sort就可以了。
最后输出时,由于存为int型的电话数据,要按照如 123-4567 的格式输出,因此要考虑0的情况,输出补零
测试时间超时,查了下别人的代码,发现有一个问题,
在输入时设置
这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。
sync_with_stdio(false) 的作用是取消缓冲区同步,因为printf()/scanf()是C函数,而cin/cout是C++函数,这些函数需要用到各自的缓冲区,为了防止各自的缓冲区错位,C++默认将C函数和C++函数的缓冲区同步。当你设置成std::ios::sync_with_stdio(false)后C++就会取消同步,这会提高cin/cout的运行速度,代价是不能和printf()/scanf()混用,否则会因不同步而出现问题,所以在这种情况下整个程序切记不可将cin/cout和printf()/scanf()混用
在ACM里,经常出现数据集超大造成 cin TLE的情况。这时候大部分人认为这是cin的效率不及scanf的错,甚至还上升到C语言和C++语言的执行效率层面的无聊争论。其实像上文所说,这只是C++为了兼容而采取的保守措施。我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要同时混用cout和printf之类。
在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。
如下所示:
参考来源: http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.html
代码地址: https://github.com/jianglj/POJ
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 244239 | Accepted: 43320 |
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
电话号码需要排序,因此可存入int型数组a,数组大小可根据输入的电话数量num来声明
cin >> num; int* a = new int[num];
以字符串形式输入至s中,输入与电话号码的对应关系可通过计算得到,代码如下
<pre name="code" class="cpp"> while (k<7) { if(s[j]>='A' && s[j]<='P') { a[i] = a[i]*10 + (s[j]-'A')/3 + 2; k++; } else if(s[j]>='R' && s[j]<='Y') { a[i] = a[i]*10 + (s[j]-'Q')/3 + 7; k++; } else if(s[j]>='0' && s[j]<='9') { a[i] = a[i]*10 + s[j] - '0'; k++; } j++; }
可以先排序,再查重,此时相同的排在相邻位置;也可以先查重,将多余的去掉后再排序。
排序用sort就可以了。
最后输出时,由于存为int型的电话数据,要按照如 123-4567 的格式输出,因此要考虑0的情况,输出补零
<span style="font-size:18px;">#include <iomanip> cout << setw(3) << setfill('0') << a[i-1] / 10000 << '-' << setw(4) << setfill('0') << a[i-1]%10000 << " " << k+1 <<endl;</span>
测试时间超时,查了下别人的代码,发现有一个问题,
在输入时设置
cin.sync_with_stdio(false);
或者将cin 改成 scanf 则不显示超时。。
又学了新知识~~
sync_with_stdio
这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。sync_with_stdio(false) 的作用是取消缓冲区同步,因为printf()/scanf()是C函数,而cin/cout是C++函数,这些函数需要用到各自的缓冲区,为了防止各自的缓冲区错位,C++默认将C函数和C++函数的缓冲区同步。当你设置成std::ios::sync_with_stdio(false)后C++就会取消同步,这会提高cin/cout的运行速度,代价是不能和printf()/scanf()混用,否则会因不同步而出现问题,所以在这种情况下整个程序切记不可将cin/cout和printf()/scanf()混用
应用
在ACM里,经常出现数据集超大造成 cin TLE的情况。这时候大部分人认为这是cin的效率不及scanf的错,甚至还上升到C语言和C++语言的执行效率层面的无聊争论。其实像上文所说,这只是C++为了兼容而采取的保守措施。我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要同时混用cout和printf之类。在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。
如下所示:
代码地址: https://github.com/jianglj/POJ
相关文章推荐
- poj 1002 电话号码查重
- poj 1002 方便记忆的电话号码 字符串处理+排序
- POJ 1002 电话号码字符串处理
- 电话号码转换与统计(POJ-1002)
- POJ-1002(字符串+排序)
- 一个字典树问题--电话号码转化问题(POJ 1002 487-3279)
- POJ 1002 UVA 755 487--3279 电话排序 简单但不容易的水题
- POJ 1002 487-3279(排序)
- POJ1002 487-3279,电话号码转换
- POJ 1002 UVA 755 487--3279 电话排序 简单但不容易的水题
- poj 1002 (电话号码)
- POJ 1002 487-3279 排序检索。
- poj 1002 电话号码\字符串处理
- POJ 1002 电话号码字符串处理
- POJ 1002 487-3279(排序or不排序)
- POJ1002 方便记忆的电话号码
- POJ 1002(不用排序的方法)(简单的字符串处理程序)
- POJ_1002
- POJ 2231 Moo Volume(排序+简单公式推导)
- poj 1002 "487-3279"