2993. 替换

三七茧茧

在lookfor函数那里产生了误解,怎么判断是不是最后一个不变的数组。利用flag的真假比较高效!
另:有没有大佬们有递归算法的ac?希望可以发一下!么么哒~
附上C代码:

include

include

include

include

include

int s[1111];

int Lookfor(int *p,int n)
{
int i, j;
int flag=0;
int cnt;
for(i=0;ip[j])
cnt++;
}
if(p[i]!=cnt)
{
p[i]=cnt;
flag=1;
}
}
return flag;
}

void solve()
{
int n;
scanf(“%d”,&n);
int i, j, k;
int tmp=0;
for(i=0;i<n;i++)
{
scanf(“%d”,&s[i]);
}
while(Lookfor(s,n));
for(i=0;i<n-1;i++)
printf(“%d “,s[i]);
printf(“%d\n”,s[i]);
}

int main()
{
int i, t;
scanf(“%d”,&t);
getchar();
for(i=0;i<t;i++)
{
printf(“case #%d:\n”,i);
solve();
}
return 0;
}

aiden

第一次用do while语句

#include <iostream>
using namespace std;

bool arraySame(const int *a, const int *b, int len)
{
    for (int i = 0; i < len; i++)
        if (a[i] != b[i])
            return false;
    return true;
}

void arrayCopy(int *a, const int *b, int len)
{
    for (int i = 0; i < len; i++)
        a[i] = b[i];
}

int main()
{
    int t;
    cin >> t;
    for (int z = 0; z < t; z++)
    {
        int n;
        cin >> n;
        int arr[30] = { 0 };
        for (int i = 0; i < n; i++)
            cin >> arr[i];
        int tmp[30] = { 0 };
        do
        {
            arrayCopy(tmp, arr, n);
            for (int i = 0; i < n - 1; i++)
            {
                int cnt = 0;
                for (int j = i + 1; j < n; j++)
                {
                    if (arr[j] < arr[i])
                        cnt++;
                }
                arr[i] = cnt;
            }
            arr[n - 1] = 0;
        } while (arraySame(arr, tmp, n) == false);
        cout << "case #" << z << ":" << endl;
        for (int i = 0; i < n; i++)
            cout << arr[i] << ' ';
        cout.put('\n');
    }
    return 0;
}
星渊龙骑

我的想法是当不变的数量不等于总数居量的时候一直进行操作(循环)出循环的条件是数据不变的数量等于总数据量

include

int main()
{
//输入格式
//第 1 行:一个整数 T(1≤T≤10) 为问题数。
int T = 0;
scanf(“%d”, &T);
for (int i = 0; i < T; i++) {
//对于每组测试数据:
//第 1 行是一个正整数:数列长度 N(2 \lt N \leqslant 30);大于等于\geqslant和小于等于\leqslant
int N=0;
scanf(“%d”, &N);
int a[30] = { 0 };
int count = 0;//a[n]=cnt[n]的个数
//第 2 行有 N 个正整数:
//分别为该数列第 1 至第 N 个元素的值 a1, a2, ⋯, an(a1, a2, ⋯, an均为 1 - 1000 的数)
//每两个整数之间用一个空格分开。
for (int j = 0; j < N; j++) {
scanf(“%d “, &a[j]);
}

    //从第一个元素开始依次把数列中的每个数替换为它右边比它小的数的个数
        //对该数列不断进行这个操作
        //总有一个时刻该数列将不再发生改变即此时每个数都恰好等于它右边比它小的数的个数
    while (count != N) {
        count = 0;
        for (int j = 0; j < N; j++) {
            int cnt = 0;
            for (int k = j + 1; k < N; k++) {
                if (a[j] > a[k]) {
                    cnt++;
                }
            }
            if (a[j] == cnt) {
                count++;
            }
            a[j] = cnt;
        }
    }

//输出格式
//对于每个问题输出一行问题的编号0 开始编号格式case #0: )。
    printf("case #%d:\n",i);
//然后在一行中依次输出最后数列的所有元素每两个元素之间用一个空格分开
    for (int j = 0; j < N; j++) {
        printf("%d ", a[j]);
    }
    printf("\n");
//最后一个元素后面没有空格
}

}

你当前正在回复 博客/题目
存在问题!