题解 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;
}
posted @   HappyBobb  阅读(15)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示