洛谷 P6448 [COCI2008-2009#4] A

目录

1.题目

2.分析

3.代码

题目

题目传送门

题目描述

给定五个数字组成的序列 a,1∼5 在这五个数字中均恰好出现一次。现在请按照如下操作对序列进行排序。

  1. 若 a1>a2​,则交换 a1​ 和 a2​。
  2. 若 a2​>a3​,则交换 a2​ 和 a3​。
  3. 若 a3​>a4​,则交换 a3​ 和 a4​。
  4. 若 a4​>a5​,则交换 a4​ 和 a5​。
  5. 如果序列没有变成 {1,2,3,4,5},则回到第一步,继续排序。

请在每次交换后输出当前序列。

输入格式

输入只有一行五个数,表示序列 a。

输出格式

输出若干行,每行输出五个用空格隔开的整数,表示一次交换后的序列。

输入输出样例

输入 #1                                                  输出 #1

2 1 5 3 4                            1 2 5 3 4
                                     1 2 3 5 4
                                     1 2 3 4 5

输入 #2                                                  输出 #2

2 3 4 5 1                                                    2 3 4 1 5

                                                                  2 3 1 4 5

                                                                  2 1 3 4 5

                                                                  1 2 3 4 5

说明/提示
数据规模与约定

对于全部的测试点,保证1≤a[i]​≤5,a[i] 互不相同,且不是单调递增的。

提示

可以证明,交换次数不超过 25 次。

题目译自 COCI2008-2009 CONTEST #4 T1 MJEHURIC

分析

注意看倒数第二行:交换次数不超过25次。

所以,我们可以使用暴力通过此题。

根据题目得知,最终序列一定是单调递增的,所以循环条件就是

while ((a[1] > a[2]) || (a[2] > a[3]) || (a[3] > a[4]) || (a[4] > a[5]))

然后,按照题意模拟,进行比较、交换、输出

代码

附赠AC记录

#include<bits/stdc++.h>
using namespace std;

//P6448 [COCI2008-2009#4] A

//题意:给出一个有5个数字的序列,每次比较相邻的两个数,并进行交换,输出每次交换后的结果

//1 ≤ a[i] ≤ 5

int a[6];
int main() {
	for (int i = 1; i <= 5; i++) {
		cin >> a[i];
	}
	//如果还不是有序序列,继续循环
	while ((a[1] > a[2]) || (a[2] > a[3]) || (a[3] > a[4]) || (a[4] > a[5])) {
		//比较
		if (a[1] > a[2]) {
			//交换
			swap(a[1], a[2]);
			//输出
			for (int j = 1; j <= 5; j++) {
				cout << a[j] << ' ';
			}
			cout << endl;
		}
		if (a[2] > a[3]) {
			swap(a[2], a[3]);
			for (int j = 1; j <= 5; j++) {
				cout << a[j] << ' ';
			}
			cout << endl;
		}
		if (a[3] > a[4]) {
			swap(a[3], a[4]);
			for (int j = 1; j <= 5; j++) {
				cout << a[j] << ' ';
			}
			cout << endl;
		}
		if (a[4] > a[5]) {
			swap(a[4], a[5]);
			for (int j = 1; j <= 5; j++) {
				cout << a[j] << ' ';
			}
			cout << endl;
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值