EOJ2993. 替换

这是一个关于EOJ2993题目的详细解析,介绍了如何对给定的非负整数序列进行特定的替换操作,直至序列不再变化。文章通过举例说明了操作过程,并提供了输入输出格式以及样例,帮助读者理解并解决这个问题。
摘要由CSDN通过智能技术生成

单点时限: 2.0 sec

内存限制: 256 MB

给定一个有限长度的非负整数序列。一次操作是指从第一个元素开始,依次把数列中的每个数替换为它右边比它小的数的个数。对该数列不断进行这个操作。总有一个时刻该数列将不再发生改变(即此时每个数都恰好等于它右边比它小的数的个数)。例如给定数列:

5,44,19,6,49,1,27,19,50,20

连续进行五次操作后,依次得到新数列如下:

1,6,2,1,4,0,2,0,1,0

3,8,5,3,5,0,3,0,1,0

4,8,6,4,5,0,3,0,1,0

5,8,7,5,5,0,3,0,1,0

5,8,7,5,5,0,3,0,1,0

其中,第四次操作后,数列不再发生改变。

对给定数列,循环执行上述操作,直到其不再改变为止,输出最后得到的数列。

输入格式

第 1 行:一个整数 T (1≤T≤10) 为问题数。

对于每组测试数据:

第 1 行是一个正整数:数列长度 N ( 2 \lt N \leqslant 30 );

第 2 行有 N 个正整数:分别为该数列第 1 至第 N 个元素的值 a1,a2,⋯,an( a1,a2,⋯,an均为 1 - 1000 的数),每两个整数之间用一个空格分开。

输出格式

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。

然后在一行中依次输出最后数列的所有元素,每两个元素之间用一个空格分开,最后一个元素后面没有空格。

样例

input

3
10
5 44 19 6 49 1 27 19 50 20
10
3 2 7 10 9 8 8 5 1 5
10
12 12 19 19 7 10 9 6 18 9

output

case #0:
5 8 7 5 5 0 3 0 1 0
case #1:
9 2 3 6 5 3 3 2 0 0
case #2:
6 6 6 6 3 4 3 0 1 0

1377 人解决,1446 人已尝试。

1860 份提交通过,共有 3008 份提交。

0.1 EMB 奖励。

创建: 9 年,11 月前.

修改: 4 年,5 月前.

最后提交: 7 小时前.

来源2013年编程实践课程非师范班第2次上机考试

#include <iostream>
#include <bits/stdc++.h>
#include <math.h>

#define MaxTryNum 		20
using namespace std;
class SingleJob{
public:
	int length;
	vector<int> array; 
};

int main() {
    int jobs, temp;
    SingleJob J[10];
    // 输入
    cin >> jobs;
	for(int i=0;i<jobs;i++){
		cin >> J[i].length;
		for(int j=0;j<J[i].length;j++){
			cin >> temp;
			J[i].array.insert(J[i].array.end(), temp);
		}
	}
	
	//输出
	int count=0, n=MaxTryNum;
	for(int i=0;i<jobs;i++){
		cout << "case #" << i << ":" << endl;
		while(n--){
			// 以下循环执行一次会完成一个job的替换
			for(vector<int>::iterator major=J[i].array.begin(); major!=J[i].array.end(); major++){
				for(vector<int>::iterator other=major+1; other!=J[i].array.end(); other++){
					if( *other < *major ){
						count++;
					}
				}
				*major = count;
				// printf("%d ", *it);		// 每一步打印
				count = 0;
			}
		}	
		n=MaxTryNum;	//reload
		// 逐次打印
		for(vector<int>::iterator it=J[i].array.begin(); it!=J[i].array.end(); it++){
			printf("%d", *it);
			if(it == J[i].array.end()-1){
				break;
			}
			printf(" ");
		}
		cout << endl;
	}	
	return 0;
}   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值