P1271 [Shenji 9.例1]学生自治会の選挙(Java&C ++)

【神治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;
}

おすすめ

転載: blog.csdn.net/weixin_45894701/article/details/114550939