#进阶:0816三部曲No.2:逆熵工作室

试题描述

逆熵3rd(ME社)为了提高文章质量,每一篇文章(假设全部都是英文)都会有m名编辑审核,每个编辑独立工作,会把觉得有问题的句子通过下标记录下来,比如[1,10],1表示病句的第一个字符,10表示病句的最后一个字符。也就是从1到10个字符组成的句子,是有问题的。

现在需要把多名编辑有问题的句子合并起来,送给总编辑进行最终的审核。比如编辑a指出的病句是[1,10],[32,45];b编辑指出的病句是[5,16],[78,94],那么[1,10]和[5,16]是有交叉的,可以合并成[1,16],[32,45],[78,94]。

输入

编辑数量m,之后每行是每个编辑的标记的下标集合,第一个和最后一个下标用英文逗号分隔,每组下标之间用分号分隔。

输出

合并后的下标集合,第一个和最后一个下标用英文逗号分隔,每组下标之间用分号分隔。返回结果是从小到大的递增排列。

输入示例

3
1,10;32,45
78,94;5,16
80,100;200,220;16,32

输出示例

1,45;78,100;200,220

其他说明

对于100%的数据,1<=M<=1e3,句子下标不超过int范围,每个编辑记录的下标不超过1000组。

 

这题有三个需要注意的点:一是每名编辑查找的句子数量是随机的,所以在输入上要注意;二是注意句子的合并方法;三是对结构体怪的特殊提醒:请看下面!

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
struct sentence {//句子结构体
	int a;
	char b;//其实这里可以用getchar代替输入逗号,但是Seele酱喜欢
	int c;
	bool operator<(const sentence&sentence2)const {//这个是第三个提醒。定义“<”使结构体可以用a的大小来使用sort排序。
		return a<sentence2.a;
	}
}
m[10000001];//定义非常多的句子
using namespace std;
int writer,hh=0,hhhh=0;
int main() {

	cin>>writer;
	for(int i=0; i<writer; i++) {
		int comma;
		while(scanf("%d%c%d",&m[hh].a,&m[hh].b,&m[hh].c)) {//速度输入
			hh++;//每输入一个句子数组标记+1;
			if(getchar()!=';')break;//输入分号表示这个小编还有病句,但没有输入分号就代表下一个小编该出场了
		}
	}
	sort(m,m+hh);//排序

	for(int i=0; i<hh-1; i++) {
		
			if(m[i+1].a<=m[i].c) {//要是可以合并,两个句子之间有重叠

				m[i+1].a=m[i].a;//合并错误单词
				m[i+1].c=max(m[i].c,m[i+1].c);//合并句子的长度##注意要选取更长的那一个
				m[i].a=0;
				m[i].c=0;//置0
			}
		
	}
	for(int i=0; i<hh; i++) {

		if(m[i].a!=0&&m[i].c!=0) {
			if(hhhh!=0)printf(";");//空格问题
			else hhhh++;
			printf("%d,%d",m[i].a,m[i].c);//输出
		}
	}
}

感谢@ljqmiao_的赞助!(但是代码是seele酱的)

话说逆熵什么时候转职成写文章的公司了?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值