试题 历届真题 错误票据【第四届】【省赛】【B组】

某涉密单位下发了某种票据,并要在年终全部收回。

  每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。

  因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。

  你的任务是通过编程,找出断号的ID和重号的ID。

  假设断号不可能发生在最大和最小号。

  要求程序首先输入一个整数N(N<100)表示后面数据行数。
  接着读入N行数据。
  每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000)
  每个整数代表一个ID号。

  要求程序输出1行,含两个整数m n,用空格分隔。
  其中,m表示断号ID,n表示重号ID

  例如:
  用户输入:
  2
  5 6 8 11 9
  10 12 9

  则程序输出:
  7 9


  再例如:
  用户输入:
  6
  164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
  172 189 127 107 112 192 103 131 133 169 158
  128 102 110 148 139 157 140 195 197
  185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
  149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
  113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119

  则程序输出:
  105 120

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	vector<int>a;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		int q;
		char c;
		while(cin>>q)//一直输入
		{
			a.push_back(q);
			c = getchar();//getchar函数读取最后一个字符,是回车
			if(c=='\n')//char型
				break;	
		}					
	}
	sort(a.begin(),a.end());
	int ch=0;//重号
	for(int i=0;i<a.size()-1;i++)
	{
		if(a[i]==a[i+1])
		{
			ch=a[i];
			a.erase(a.begin()+i);//删除指定的项
			break;
		}
	}
	for(int i=0;i<a.size();i++)
	{
		if(a[0]+i!=a[i])
		{
			cout<<a[i]-1<<" ";
			break;
		}
	}
	cout<<ch;	
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是一道关于双向排序的省赛试题。题目描述如下: 给定一个长度为 $n$ 的正整数序列 $a_1,a_2,\cdots,a_n$,将它们分为两,设第一的元素为 $b_1,b_2,\cdots,b_m$,第二的元素为 $c_1,c_2,\cdots,c_{n-m}$,满足: - $b_1,b_2,\cdots,b_m$ 按照从大到小的顺序排列。 - $c_1,c_2,\cdots,c_{n-m}$ 按照从小到大的顺序排列。 - 对于所有 $1\le i<j\le m$,有 $b_i+b_j>a_k$,其中 $1\le k\le n-m$。 - 对于所有 $1\le i<j\le n-m$,有 $c_i+c_j<b_k$,其中 $1\le k\le m$。 现在给定 $n$ 和 $a_1,a_2,\cdots,a_n$,求符合条件的分方案数。 例如,当 $n=4$,$a_1=2,a_2=4,a_3=1,a_4=3$ 时,符合条件的分方案有 $3$ 种,分别为: - $b_1=4,b_2=2$,$c_1=1,c_2=3$; - $b_1=4,b_2=3$,$c_1=1,c_2=2$; - $b_1=3,b_2=2$,$c_1=1,c_2=4$。 请问这道题应该如何解答呢? ### 回答2: 第十二届省赛B的双向排序问题是一个典型的排序问题。 双向排序是指按照特定的规则对数据进行排序,既可以按照从小到大,也可以按照从大到小的顺序进行排列。这个问题可以使用排序算法来解决。 解决该问题的一种方法是使用冒泡排序算法。该算法的思想是通过多次遍历数,比较相邻的元素并交换位置,使得最大(或最小)的元素逐渐移到末尾(或开头),以此实现排序。 具体步骤如下: 1. 定义一个布尔变量flag来表示是否发生了元素交换的操作,默认为false。 2. 从数的第一个元素开始,依次比较相邻元素,如果前一个元素大于(或小于)后一个元素,则交换它们的位置,并将flag设为true,表示发生了交换。 3. 遍历完一次数后,如果flag仍为false,说明数已经是有序的,可以结束排序。 4. 如果flag为true,继续进行下一次遍历,从头开始重复上述步骤。 5. 重复步骤2-4,直到数完全排序。 在双向排序的问题中,需要使用两个冒泡排序。首先,按照从小到大的顺序对每一行进行排序,然后按照从大到小的顺序对每一列进行排序。这样一来,就可以实现双向排序。 总结起来,双向排序问题可以使用冒泡排序算法来解决。通过多次遍历数,分别按照行和列进行排序,即可达到双向排序的目的。 ### 回答3: 第十二届省赛B试题是关于双向排序的。双向排序是一种特殊的排序方法,既可以按照某一列的数值大小进行排序,又可以按照某一行的数值大小进行排序。 假设给定一个m行n列的矩阵,我们需要设计一个算法,使得矩阵按照以下规则进行排序: 1. 首先按照每一行的最小值进行排序,即每一行元素中最小的数排在前面; 2. 如果有两行及以上的最小值相同,则按照其所在行数从小到大进行排序; 3. 对于行数相同的元素,按照其所在列数从小到大进行排序。 我们可以采用以下步骤实现双向排序: 1. 遍历每一行,找到每一行的最小值,并将其与第一列的元素交换位置,保证每一行的最小值都在第一列; 2. 对矩阵按照第一列的数值大小进行排序,即将每一行的第一个元素作为关键字进行排序; 3. 对于第一列相同的元素,按照其所在行数从小到大进行排序,可以使用快速排序等算法实现; 4. 对于行数相同的元素,按照其所在列数从小到大进行排序,可以使用冒泡排序等算法实现。 通过以上步骤,我们可以得到按照双向排序规则排列的矩阵。这种排序方法可以保证每一行的最小值都在前面,同时满足其他排序规则。双向排序不仅简洁高效,还可以直观地展示矩阵中元素的分布情况,方便后续的数据分析和处理。 总结起来,双向排序是一种特殊的排序方法,可以按照每一行的最小值先排序,再按照行数和列数进行排序。它可以通过简单的交换和排序算法来实现,对于需要按照行和列进行排序的矩阵数据,是一种非常有用的排序方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值