您的位置:首页 > 其它

POJ 1002 电话号码排序查重

2014-09-18 22:03 155 查看
487-3279

Time Limit: 2000MSMemory Limit: 65536K
Total Submissions: 244239Accepted: 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的绑定,进一步加快执行效率。

如下所示:

参考来源: http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.html
代码地址: https://github.com/jianglj/POJ
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: