当前位置: 代码迷 >> 综合 >> 1060. 数组排序
  详细解决方案

1060. 数组排序

热度:88   发布时间:2023-12-06 11:25:20.0

在这里插入图片描述
样例:
input:
3
10
9 6 3 10 3 10 6 4 3 4
10
10 9 8 7 6 5 4 3 2 1
20
4 3 7 8 6 5 8 4 2 2 7 9 5 9 6 8 6 6 3 10

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

思路:
struct里搞个cnt记录个数,外面搞个vis[]记录放的位置就ok
参考代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=11111;
int maxx=-0x3f3f3f3f;
int t,n,cnt;
int vis[555];
struct stu
{
    int i;int cntt;bool operator<(const stu &b){
    if(cntt==b.cntt) return i<b.i;else return cntt>b.cntt;}
}a[maxn];
int main()
{
    cin>>t;for(int i=1;i<=t;i++){
    cin>>n;cnt=1;for(int j=1;j<=n;j++){
    int temp;cin>>temp;if(vis[temp]!=0){
    a[vis[temp]].cntt++;}else{
    vis[temp]=cnt;a[cnt].i=temp;a[cnt].cntt=1;cnt++;}//cout<<"temp="<<temp<<" "<<"vis[temp]="<<vis[temp]<<" "<<"a[vis[temp]].cntt="<<a[vis[temp]].cntt<<endl;}sort(a+1,a+cnt+1);cout<<"case #"<<i-1<<":"<<endl;for(int j=1;j<cnt-1;j++){
    //cout<<"a[j].i="<<a[j].i<<" "<<"a[j].cntt="<<a[j].cntt<<endl;for(int k=1;k<=a[j].cntt;k++) cout<<a[j].i<<" ";}if(a[cnt-1].cntt==1) cout<<a[cnt-1].i;else{
    for(int k=1;k<a[cnt-1].cntt;k++) cout<<a[cnt-1].i<<" ";cout<<a[cnt-1].i;}cout<<endl;memset(&a, 0, sizeof (stu));for(int j=1;j<=555;j++) vis[j]=0;}return 0;
}