题解 CF34C 【Page Numbers】
这里看了看大家的代码,发现我的代码真是麻烦了……
但是我的读入根本不用字符!
没有人知道 scanf 可以直接存输入的东西吗?
这里看样例,都是一个整数,一个逗号,所以我们把读入写成这样:
int x;
while (cin >> x)
{
scanf(",");
}
那么最后一个逗号是没有的,怎么处理?它会读入到 EOF,就算没有读入逗号或者读入其他都没有关系。
然后,每次读入,加入到一个 set 当中,用一个迭代器去遍历,对于每一个数,往后搜索,如果当前这个数列满足条件,且下一个不满足条件,输出前面,后面。
但是最后一个数后面不用输出逗号,我采用的是把每次的答案加逗号存到一个 string 中,最后 push_back ,把最后的逗号删掉。
这题还涉及到数组传参,用指针。
代码:
#include <iostream>
#include <string> // 用string
#include <string.h> // memset
#include <set> // set
#include <cstdio> // scanf
using namespace std;
inline bool check(int* a, int len)
{
if (len == 1) return false;
for (register int i = 2; i <= len; i++)
{
if (a[i] - a[i - 1] != 1) return false;
}
return true;
}
/*inline void print(int* a, int len)
{
for (register int i = 1; i <= len; i++)
{
cout << a[i] << " ";
}
cout << endl;
}*/
string ans;
int a[105];
int main()
{
set<int> st;
int x;
while (cin >> x)
{
st.insert(x);
scanf(",");
}
set<int>::iterator it_end = st.end();
for (register set<int>::iterator it = st.begin(); it != it_end; )
{
memset(a, 0, sizeof(a));
set<int>::iterator it_tmp = it, new_it;
bool flag = false;
++it_tmp;
int cur = 1, begin = *it, end = 0;
a[cur] = *it;
for (register set<int>::iterator it_2 = it_tmp; it_2 != it_end; ++it_2)
{
a[++cur] = *it_2;
if (check(a, cur))
{
end = *it_2;
new_it = it_2;
flag = true;
}
else break;
}
//print(a, cur);
if (flag)
{
ans += to_string(begin) + "-" + to_string(end) + ",";
}
else ans += to_string(*it) + ",";
if (flag)
{
it = new_it;
++it;
}
else ++it;
}
ans.pop_back();
cout << ans << endl;
//system("pause");
return 0;
}

浙公网安备 33010602011771号