这道题问题倒不是很难,但是输入输出比较麻烦:
#include<bits/stdc++.h>
using namespace std;
vector<int>v;
map<int,int>m;
int a[1005];
void s2i(string &temp,int &a)
{
stringstream ss;
ss<<temp;
ss>>a;
}
int main()
{
int line;cin>>line;getchar();
int index=0;
for(int i=0;i<line;i++)
{
string x;
getline(cin,x);
//拆分
istringstream ss(x);
string temp;
while(getline(ss,temp,' '))
{
s2i(temp,a[index++]);
}
}
for(int i=1;i<index;i++)
{
if(a[i]==a[i-1]+2)printf("%d ",a[i]-1);
if(a[i]==a[i-1])printf("%d",a[i]);
}
return 0;
}
最后要排序,不排序就错了。这是没排序的:
原因:
没有排序时的数组a:
当遍历到a[i-1]=12,a[i]=10的时候,因为差值为2,又输出了a[i]-1,即11.
因此我们需要排序:
排完序的:
看答案没毛病,但是实际上还有一点小问题,就是假如我们在遍历的工程中先遇到重复的就直接输出了,但是题目要求一定要先输出断号的再输出重复的,因此我们需要用两个变量来保存一下,最后输出变量:
//思想
//断号id的话那么后一个id肯定和前面id差值超过1
//如果是重号呢? 如果是重号即两个id相同
//求解倒不难,关键在于数据读入的处理
//我们需要按照字符串读入 (目的是按行读入)
//然后将其转化为整形,存储到数组a里面(目的是为了利用下标来判断是否重号和断号)
#include <bits/stdc++.h>
using namespace std;
int a[110];
int m,n;
void s2i(string& temp,int& a){
stringstream ss;
ss<<temp;
ss>>a;
}
int main()
{
int index=0;
int n;cin>>n;getchar();
// cout<<n<<endl;
//按行读入
for(int i=0;i<n;i++){
string x;getline(cin,x);
//cout<<x<<endl;
//去掉空格
istringstream ss(x);
string temp;
//getline()默认是读取到/n截至,但是我们可以通过第三个参数指定格式,在这里我们让它读取到空格就结束
while(getline(ss,temp,' ')) //把ss里面的字符导入到temp里面
{
s2i(temp,a[index++]); //把字符串转化为整形,存储到数组a里面
}
}
//排序的目的是为了找出最先断号和重号的
sort(a,a+index);
for(int i=1;i<index;i++)
{
if(a[i]==a[i-1]+2)m=a[i-1]+1;
if(a[i]==a[i-1])n=a[i-1];
}
cout<<m<<" "<<n<<endl;
return 0;
}