试题描述 |
逆熵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,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酱的)