【神治9.例1】学生自治会の選挙
トピックリンク:https://www.luogu.com.cn/problem/P1271
タイトル説明
学校は学生組合のメンバーを選出しています。n(n≤999)人の候補者がいて、各候補者には1からnまでの番号が付けられています。これでm(m <= 2000000)の投票が集められ、各投票用紙には候補者のシリアルが書き込まれます。数。ここで、これらの投票の山を、投じられた投票数の昇順で並べ替えたいと思います。ソートされた投票番号を見つけるには、nとm、およびm個の投票用紙の番号を入力します。
入力フォーマット
番号
出力フォーマット
番号
サンプルの入力と出力
#1を入力してください
5 10
2 5 2 2 5 2 2 2 1 2
出力#1
1 2 2 2 2 2 2 2 5 5
問題解決のアイデア:
C ++では、直接クイックソートまたはカウントソートでJesmoraによる問題を解決できますが、Java直接ソートではQAQがタイムアウトまたはオーバーメモリになる可能性があるため、StringBufferを使用して文字列バッファーオブジェクトを作成することを検討できます。
コードは次のように表示されます。
Java
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int[] a=new int[sc.nextInt()+1];
int m=sc.nextInt();
for(int i=0;i<m;i++)
a[sc.nextInt()]++;
StringBuffer s=new StringBuffer(); //创建字符串缓冲区对象,用于存储数据
for(int i=1;i<a.length;i++)
while(a[i]--!=0)
s.append(i+" "); //追加空格
System.out.println(s);
}
}
C ++(クイックソート)
#include<iostream>
#include<algorithm>
using namespace std;
int a[2000010],n,m;
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
cin>>a[i];
sort(a,a+m);
for(int i=0;i<m;i++)
cout<<a[i]<<" ";
return 0;
}
C ++(カウントソート)
#include<iostream>
using namespace std;
#define ll long long
ll b[1005],n,m,k;
int main() {
cin>>m>>n;
for(ll i=1; i<=n; ++i) {
cin>>k;b[k]++;
}
for(ll i=1; i<=m; i++) {
while(b[i]>0) {
cout<<i<<" ";
b[i]--;
}
}
return 0;
}