2013年蓝桥杯A组真题 1.错误票据 知识点:输入问题

596 阅读2分钟

题目:1.错误票据 - 蓝桥云课 (lanqiao.cn)

解析:2013年c++A组题7_哔哩哔哩_bilibili

这道题问题倒不是很难,但是输入输出比较麻烦:

#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;
}

最后要排序,不排序就错了。这是没排序的:

image.png

原因:

没有排序时的数组a: image.png

当遍历到a[i-1]=12,a[i]=10的时候,因为差值为2,又输出了a[i]-1,即11. image.png

因此我们需要排序: image.png

排完序的: image.png

看答案没毛病,但是实际上还有一点小问题,就是假如我们在遍历的工程中先遇到重复的就直接输出了,但是题目要求一定要先输出断号的再输出重复的,因此我们需要用两个变量来保存一下,最后输出变量:

                                      //思想
                          //断号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;
}