题解 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;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现