您的位置:首页 > 其它

EOJ2993-替换

2020-04-05 18:20 274 查看

题目

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

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

Code

#include <iostream>
using namespace std;

int main() {
int N,num;
int a[31];
int cnt, errorcnt;
int flag;
int i, j, k;
cin >> N;
for (i = 0; i < N; i++)
{
errorcnt = 1;
cin >> num;
for (j = 0; j < num; j++) cin >> a[j];
while (errorcnt!=0)
{
errorcnt = 0;
flag = 0;
for (j = 0; j < num; j++) {
cnt = 0;
for (k = j + 1; k < num; k++) {
if (a[j] > a[k])
cnt++;
}
if (a[j] != cnt) {
a[j] = cnt;
errorcnt++;
}
}
}

cout << "case #" << i << ":" << endl;
for (k = 0; k < num; k++)
cout << a[k] << " ";
cout << endl;
}
return 0;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
-avocado- 发布了15 篇原创文章 · 获赞 0 · 访问量 443 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: