错误票据
题目描述
核心思路
先把所有数据排序,如果相邻的两个数相差大于1,则说明有断号,比如 a [ i − 1 ] = 6 a[i-1]=6 a[i−1]=6, a [ i ] = 8 a[i]=8 a[i]=8,那么就说明有断号,而断号就是 a [ i ] − 1 = 8 − 1 = 7 a[i]-1=8-1=7 a[i]−1=8−1=7。如果相邻的两个数是相同的,则说明有重号,比如 a [ i − 1 ] = = a [ i ] a[i-1]==a[i] a[i−1]==a[i]。
这里的难点不在于解题思路,而在于怎么处理输入。题目并没有说明一行要输入多少个数。
一般,对于没有具体说明一行要输入多少个数时,都有以下写法:
写法1:
int n=0;
while(cin>>a[n])
n++;
写法2:
int n=0;
while(~scanf("%d",&a[n]))
n++;
写法3:
int n=0;
while(scanf("%d",&a[n])!=EOF)
n++;
写法4:
int n=0;
string line;
getline(cin,line);
stringstream ssin(line);
while(ssin>>a[n])
n++;
代码
写法1:
#include<iostream>
#include<algorithm>
using namespace std;
//最多有100行 每一行最多输入100个数 那么最多有100*100=10000个数
const int N=10010;
int n;
int a[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
//或者写成while(cin >>a[n])
//或者写成while(scanf("%d",&a[n])!=EOF)
while(~scanf("%d",&a[n])) //一直读入,直到碰到文件结束符
{
n++; //统计数据个数
}
}
sort(a,a+n); //排序
int same=0; //重号
int split=0;//断号
for(int i=1;i<n;i++)
{
if(a[i]-a[i-1]>1) //说明有断号
split=a[i]-1;
if(a[i]==a[i-1])//说明有重号
same=a[i];
}
printf("%d %d\n",split,same);
return 0;
}
写法2:stringstream流
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
using namespace std;
const int N=10010;
int n;
int a[N];
int cnt[N];
int main()
{
int T;
scanf("%d",&T);
cin.get();
while(T--)
{
string line;
getline(cin,line);
stringstream ssin(line);
while(ssin>>a[n])
n++;
}
sort(a,a+n); //排序
int same=0; //重号
int split=0;//断号
for(int i=1;i<n;i++)
{
if(a[i]-a[i-1]>1) //说明有断号
split=a[i]-1;
if(a[i]==a[i-1])//说明有重号
same=a[i];
}
printf("%d %d\n",split,same);
return 0;
}