问题一:分类排序
题目描述:
从键盘输入10个整数(10个整数均不相同), 然后再从键盘中输入一个整数a,如果该整数a为奇数, 且与这10个整数中的任一个数相同,则删掉与a相同的 这个数,并将剩下的9个数按升序排序输出;若a为偶数, 且与这10个数都不同,则加入a,并将这11个数降序排 序输出;否则,则将这10个数奇数在前,偶数在后, 降序排列输出。例如,10个数分别为6,89,34,12, 0,-8,78,15,9,3.若a为9,则输出为:-8,0,3, 6,12,15,34,78,89.若a为2,则输出为:89,78, 34,15,12,9,6,3,2,0,-8.若a为7或者12,则 输出为:89,15,9,3,78,34,12,6,0,-8.
输入要求:
测试数据的组数n 第一组测试数据的10个整数 第一组的整数a 第二组测试数据的10个整数 第二组的整数a ......第n组测试数据的10个整数 第n组的整数a
输出要求:
第一组数据排序输出 第二组数据排序输出 .......第n组数据排序输出
#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
using namespace std;
int main() {
int n;
cin >> n;
while (n--)
{
int arr[10], a, b, c;
for (int i = 0; i < 10; i++)//输入10个整数
{
cin >> arr[i];
}
cin >> a;
c = 0;
for (int j = 0; j < 10; j++)//判断数组中的数是否和a相等
{
if (a == arr[j])
{
b = arr[j];
c++;
}
}
int temp1;
if (abs(a) % 2 && (c == 1))//如果a是奇数而且a和数组中的数相同则删掉并升序输出
{
for (int k = 0; k < 10 - 1; k++)//对整个数组进行冒泡排序
{
for (int l = 0; l < 10 - 1 - k; l++)
{
if (arr[l] > arr[l + 1])
{
temp1 = arr[l];
arr[l] = arr[l + 1];
arr[l + 1] = temp1;
}
}
}
for (int m = 0; m < 10; m++)//去掉与a相等的数
{
if (arr[m] == b)
{
for (int k = m; k < 10; k++)
{
arr[k] = arr[k + 1];
}
}
}
for (int i = 0; i < 9; i++)
{
cout << arr[i] << " \n"[i == 8];
}
}
else if ((abs(a) % 2 == 0) && (c == 0))//如果a是偶数且a和数组中的数不同则添加并降序输出
{
int brr[11];
brr[10] = a;
for (int i = 0; i < 10; i++)//将数组arr赋值给数组brr,并将a添加到brr中
{
brr[i] = arr[i];
}
int temp2;
for (int k = 0; k < 11 - 1; k++)//利用冒泡排序对数组brr排序
{
for (int l = 0; l < 11 - 1 - k; l++)
{
if (brr[l] < brr[l + 1])
{
temp2 = brr[l];
brr[l] = brr[l + 1];
brr[l + 1] = temp2;
}
}
}
for (int m = 0; m < 11; m++)
{
cout << brr[m] << " \n"[m == 10];
}
}
else//不符合奇同和偶不同则奇数在前偶数在后降序输出
{
int js[10], os[10], s, o;
s = 0;
o = 0;
for (int k = 0; k < 10; k++)//对数组中的奇偶进行分类
{
if (abs(arr[k]) % 2)
{
js[s] = arr[k];
s++;
}
else
{
os[o] = arr[k];
o++;
}
}
int temp3;
for (int k = 0; k < s - 1; k++)//对奇数进行冒泡排序,使其降序
{
for (int l = 0; l < s - 1 - k; l++)
{
if (js[l] < js[l + 1])
{
temp3 = js[l];
js[l] = js[l + 1];
js[l + 1] = temp3;
}
}
}
for (int m = 0; m < s; m++)
{
cout << js[m] << " ";
}
int temp4;
for (int k = 0; k < o - 1; k++)//同理
{
for (int l = 0; l < o - 1 - k; l++)
{
if (os[l] < os[l + 1])
{
temp4 = os[l];
os[l] = os[l + 1];
os[l + 1] = temp4;
}
}
}
for (int m = 0; m < o; m++)
{
cout << os[m] << " \n"[m == o - 1];
}
}
}
return 0;
}
题目要求是写成函数的形式,请读者自行借阅……
问题二:排座椅
题目描述:
上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。
请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。
输入要求:
有5个用空格隔开的整数,分别是M,N,K,L,D(2<=N,M<=1000,0<=K<M,0<=L<N,D<=2000)。
接下来的D行,每行有4个用空格隔开的整数。第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。
输入数据保证最优方案的唯一性。
输出要求:
第一行包含K个整数,a1,a2……aK,表示第a1行和a1+1行之间、第a2行和a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai< ai+1,每两个整数之间用空格隔开(行尾没有空格)。
第二行包含L个整数,b1,b2……bL,表示第b1列和b1+1列之间、第b2列和b2+1列之间、…、第bL列和第bL+1列之间要开辟通道,其中bi< bi+1,每两个整数之间用空格隔开(列尾没有空格)。
#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<cstring>
using namespace std;
int main() {
int m, n, k, l, D;
cin >> m >> n >> k >> l >> D;
int col[10000], row[10000];
memset(col, 0, 10000 * sizeof(int));//将标记行列的数组都赋值为0
memset(row, 0, 10000 * sizeof(int));
while (D--)
{
int x, y, p, d, minn;
cin >> x >> y >> p >> d;
if (x == p)//两者在同一行,小的列标+1
{
minn = min(y, d);
col[minn]++;
}
if (y == d)//两者在同一列,小的行标+1
{
minn = min(x, p);
row[minn]++;
}
}
int arr1[l], arr2[k], max0;//arr1记录纵线,arr2记录横线
for (int a = 0; a < l; a++)//要找l条纵线
{
int site = 0;
max0 = 0;
for (int b = 1; b < n; b++)//依次找出纵线上最多对的一条
{
if (col[b] > max0)
{
max0 = col[b];
site = b;
}
}
arr1[a] = site;//标记位置
col[site] = 0;//原位置清零
}
for (int a = 0; a < k; a++)//要找k条横线
{
int site = 0;
max0 = 0;
for (int b = 1; b < m; b++)//依次找出横线上最多对的一条
{
if (row[b] > max0)
{
max0 = row[b];
site = b;
}
}
arr2[a] = site;//标记位置
row[site] = 0;//原位置清零
}
for (int a = 0; a < l - 1; a++)//对纵线进行冒泡排序
{
for (int b = 0; b < l - a - 1; b++)
{
int temp1;
if (arr1[b] > arr1[b + 1])
{
temp1 = arr1[b];
arr1[b] = arr1[b + 1];
arr1[b + 1] = temp1;
}
}
}
for (int a = 0; a < k - 1; a++)//对横线进行冒泡排序
{
for (int b = 0; b < k - a - 1; b++)
{
int temp2;
if (arr2[b] > arr2[b + 1])
{
temp2 = arr2[b];
arr2[b] = arr2[b + 1];
arr2[b + 1] = temp2;
}
}
}
for (int i = 0; i < k; i++)
{
cout << arr2[i] << " \n"[i == k - 1];
}
for (int i = 0; i < l; i++)
{
cout << arr1[i] << " \n"[i == l - 1];
}
return 0;
}