问题标题: 酷町堂:3828   分块排序

0
0
已解决
李瑞曦
李瑞曦
高级天翼
高级天翼

3828   分块排序

经验值:800 时间限制:1000毫秒

题目描述 Description

现在有一个长度为n的正整数序列(10<=n<=20000),现在需要将这个序列分块进行从大到小排序。
例如长度为10的序列,按照每4个数字进行分块,每块的数据进行排序:
1 3 5 4 2 2 9 1 8 7

排序后的结果为:
5 4 3 1
9 2 2 1
8 7

输入描述 Input Description

第一行输入一个正整数n表示序列的长度(10<=n<=20000),以及分块大小m(m<=100)
第二行输入n个空格隔开的正整数(不超过100,000,000)

输出描述 Output Description

按块输出排序后的序列

样例输入 Sample Input

10 4 1 3 5 4 2 2 9 1 8 7

样例输出 Sample Output

5 4 3 1

9 2 2 1

8 7

数据范围及提示 Data Size & Hint

若最后一块数据不够分块大小,仍然当做一个完整分块进行排序。

----------------------------------------------------------------------

为什么我的代码一直输出:

5 4 3 1

9 8 2 1

8 7

????

求大佬找错

我的代码:

#include<iostream>
#include<algorithm>
using namespace std;
int a[111111],b[11];
int main(){
    int n;
    int m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int cnt=1;
    for(int i=1;i<=n;i++){
        if(cnt==m+1){
            sort(b+1,b+m+1);
            for(int j=m;j>=1;j--){
                cout<<b[j]<<" ";
            }
            cout<<endl;
            cnt=1;
        }
        else{
            b[cnt]=a[i];
            //cout<<a[i]<<endl;
            cnt++;
        }
    }
    sort(a+n-n%m,a+n+1);
    for(int i=n;i>n-n%m;i--){
        cout<<a[i]<<" ";
    }
}

 

李瑞曦在2021-04-23 19:06:40追加了内容

ding

李瑞曦在2021-04-23 19:21:19追加了内容

ding

李瑞曦在2021-04-23 19:34:49追加了内容

ding

李瑞曦在2021-04-23 19:43:14追加了内容

you ren ma

李瑞曦在2021-04-23 20:22:32追加了内容

啊啊啊

李瑞曦在2021-04-23 20:50:56追加了内容

有人么

李瑞曦在2021-04-23 21:05:43追加了内容

李瑞曦在2021-04-23 21:43:53追加了内容

李瑞曦在2021-04-24 09:10:40追加了内容

@张帆 是这样吗?

90分啊

#include<iostream>
#include<algorithm>
using namespace std;
int a[1111111],b[11],t[1111111];
int main(){
    int n, m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int cnt=0;//当前块中元素的下标
    for(int i=1;i<=n;i++){
        if(cnt==m){//当下标达到m+1时,说明一块已经结束了
            sort(b+1,b+m+1);
            for(int j=m;j>=1;j--){//因为是从小到大排序的,所以要倒序输出
                cout<<b[j]<<" ";
            }
            cout<<endl;
            cnt=0;//下标要重新计数
        }
        b[++cnt]=a[i];
        //cout<<a[i]<<endl;
        //cnt++;
    }
    sort(a+n-n%m+1,a+n+1);
    for(int i=n;i>=n-n%m+1;i--){//输出剩下的数
        cout<<a[i]<<" ";
    }
}

 


0
已采纳
张帆
张帆
中级天翼
中级天翼

将cnt初值设为0

然后如果cnt==m就……

20行改为cnt=0;

然后把else{}去掉

我要回答