CF70B Text Messaging 题解

Content

有一个短信软件最多只能够上传长度为 \(n\) 的消息。现在你有一段话,但不一定能够一次发出。这段话由若干句话组成,以 .? 或者 ! 为结尾。你不能够将一句话拆开来发,但是如果容量允许,你可以将几句话合并起来发送。求最少需要发送几次。

请注意,同时发送多句话时句与句之间要加上一个空格

数据范围:\(2\leqslant n\leqslant 255\)

Solution

我们将每句话分开来存储,然后一个一个加进去,碰到有一句话超过了 \(n\) 就肯定不可能了,否则放进去尽量多的句子,直到不能够再加进去再一次记录答案。

Code

int n, cnt = 1, iee, ans;
string all;
struct sentences {
	int len;
	string s;
}a[257];

int main() {
	getint(n);
	getline(cin, all);
	int alllen = all.size();
	_for(i, 0, alllen - 1) {
		if((all[i] == '.' || all[i] == '?' || all[i] == '!') && i != alllen - 1)	a[cnt++].s += all[i++];
		else	a[cnt].s += all[i];
	}
	_for(i, 1, cnt)	{
		a[i].len = a[i].s.size();
		if(iee + a[i].len + (iee ? 1 : 0) > n) {
			if(!iee || a[i].len > n)	return printf("Impossible"), 0;
			else	ans++, iee = 0;
		} 
		iee += a[i].len + (iee ? 1 : 0);
	}
	printf("%d", ans + 1);
	return 0;
}
posted @ 2021-12-17 14:21  Eason_AC  阅读(40)  评论(0)    收藏  举报