洛谷 【算法1-2】排序 CPP and Java 双语无题解只代码

P1271【深基9.例1】选举学生会

CPP

#include <iostream>

using namespace std;

//桶排序 
int a[1005] = {0};
int n,m,t;
int main(){
	cin>>n>>m;
	for(int i=0;i<m;i++){
		cin>>t;
		a[t]++;
	}
	for(int i=1;i<=n;i++){
		while(a[i] != 0){
			cout<<i<<" ";
			a[i]--;
		}
	}
	return 0;
}

Java

package P1271;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int m = scanner.nextInt();
		int[] a = new int[1005];
		for(int i=0;i<m;i++) {
			a[scanner.nextInt()]++;
		}
		//出票
		StringBuffer sb = new StringBuffer();
		for(int i=1;i<=n;i++) {
			while(a[i] != 0) {
				sb.append(i+" ");
				a[i]--;
			}
		}
		//输出控制台会增加io操作,尽量减少使用,提高程序运行效率
		System.out.println(sb);
	}
}

P1177【模板】排序

CPP

#include <iostream>

using namespace std;
int n,a[100010],t[100010];

void print(){
	for(int i=1;i<=n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
}

void qsort(int *a,int l,int r){
	if(r-l<=1){
		return;//只有一个数或者空序列不需要排序 
	}
	int flag = a[rand()%(r-l)+l];//生成[l,r]之间的随机数 
	int x=l,y=r;
	for(int i=l;i<r;i++){
		if(a[i] < flag){
			t[x] = a[i];
			x++;
		}else if(a[i] > flag){
			y--;
			t[y] = a[i];
		}
	}
	//左边复制 
	for(int i=l;i<x;i++){
		a[i] = t[i];
	}
	//右边复制
	for(int i=y;i<r;i++){
		a[i] = t[i];
	} 
	for(int i=x;i<y;i++){
		a[i] = flag;
	}
	qsort(a,l,x);
	qsort(a,y,r);
	return ;
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	qsort(a,1,n+1);//排序1到n个数,左闭右开的区间
	print(); 
	return 0;
} 

Java

package P1177_sort;

import java.util.Scanner;

public class Main {
	
	static int[] a = new int[100010];
	static int[] t = new int[100010];
	static int n;
	
	static void print() {
		StringBuffer sb = new StringBuffer();
		for(int i=1;i<=n;i++) {
			sb.append(a[i]).append(" ");
		}
		System.out.println(sb);
	}
	
	static void qsort(int l,int r) {
		if(r-l<=1) {
			return ;
		}
		int flag = a[(r+l)/2];
		int x=l,y=r;
		for(int i=l;i<r;i++) {
			if(a[i] < flag) {
				t[x] = a[i];
				x++;
			}else if(a[i] > flag) {
				y--;
				t[y] = a[i];
			}
		}
		//左边复制
		for(int i=l;i<x;i++) {
			a[i] = t[i];
		}
		//右边复制
		for(int i=y;i<r;i++) {
			a[i] = t[i];
		}
		for(int i=x;i<y;i++) {
			a[i] = flag;
		}
		qsort(l,x);
		qsort(y,r);
		return ;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		for(int i=1;i<=n;i++) {
			a[i] = sc.nextInt();
		}
		qsort(1,n+1);
		print();
	}

}

P1923 【深基9.例4】求第 k 小的数

CPP

#include <iostream>

using namespace std;
int n,k;
int a[5000005];

void qsort(int l,int r){
	int x=l,y=r;
	int flag = a[(l+r)/2];
	do{
		while(a[y] > flag){
			y--;
		}
		while(a[x] < flag){
			x++;
		}
		if(x <= y){
			swap(a[x],a[y]);
			x++;
			y--;
		}
	}while(x <= y);
	//快排后数据分为三块:l<=y<=x<=r
	//搜索左边 
	if(k <= y){
		qsort(l,y);
	} else if(x <= k){
	//搜索右边 
		qsort(x,r);
	}else{
		printf("%d",a[y+1]);
		return; 
	}
}

int main(){
	//printf,scanf比cin,cout要快 
	cin>>n>>k;
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	qsort(0,n-1);
	return 0;
}

Java

package P1923;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Scanner;

public class Main {
	
	static int n,k;
	static int[] a = new int[5000005];
	
	static void swap(int x,int y) {
		int temp = a[x];
		a[x] = a[y];
		a[y] = temp;
	}
	
	static void qsort(int l,int r) {
		int x=l,y=r;
		int flag = a[(l+r)/2];
		do {
			while(a[y] > flag) {
				y--;
			}
			while(a[x] < flag) {
				x++;
			}
			if(x <= y) {
				swap(x,y);
				x++;
				y--;
			}
		}while(x <= y);
		if(k <= y) {
			qsort(l,y);
		}else if(k >= x) {
			qsort(x,r);
		}else {
			System.out.println(a[y+1]);
			return ;
		}
	}

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		//取代Scanner进行快读
		StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		st.nextToken();
		n=(int) st.nval;
		st.nextToken();
		k=(int) st.nval;
		for(int i=0;i<n;i++) {
			st.nextToken();
			a[i] = (int) st.nval;
		}
		qsort(0,n-1);
	}

}

P1059 [NOIP2006 普及组] 明明的随机数

CPP

#include <iostream>
#include <set>

using namespace std;

int main() {
    int n;
    cin >> n;

    set<int> distinctNumbers;

    int t;
    for (int i = 0; i < n; i++) {
        cin >> t;
        distinctNumbers.insert(t);
    }

    cout << distinctNumbers.size() << endl;

    for (auto num : distinctNumbers) {
        cout << num << " ";
    }

    cout << endl;
    return 0;
}

Java

package P1059;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n;
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		Set<Integer> set = new HashSet<>();
		int t;
		for(int i=1;i<=n;i++) {
			t = sc.nextInt();
			set.add(t);
		}
		System.out.println(set.size());
		Integer[] array = set.toArray(new Integer[0]);
		Arrays.sort(array);
		StringBuffer sb = new StringBuffer();
		for(Integer num:array) {
			sb.append(num.intValue()).append(" ");
		}
		System.out.println(sb);
	}

}

P1093 [NOIP2007 普及组] 奖学金

CPP

#include <iostream>
#include <algorithm>

using namespace std;

int n;
struct stu{
	int num;
	int c,m,e;
	int sum;
}student[305];

bool cmp(stu a,stu b){
	if(a.sum > b.sum){
		return 1;
	}else if(a.sum < b.sum){
		return 0;
	}else{
		if(a.c > b.c){
			return 1;
		}else if(a.c < b.c){
			return 0;
		}else{
			if(a.num < b.num){
				return 1; 
			}else{
				return 0;
			}
		}
	}
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		student[i].num = i;
		cin>>student[i].c>>student[i].m>>student[i].e;
		student[i].sum = student[i].c + student[i].e + student[i].m;
	}
	sort(student+1,student+1+n,cmp);
	for(int i=1;i<=5;i++){
		cout<<student[i].num<<" "<<student[i].sum<<endl;
	}
	return 0;
}

Java

package P1093;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

//学生类
class Student{
	
	int num;
	int c,m,e;
	int sum;
	
	public Student(int num,int c,int m,int e) {
		this.num = num;
		this.c = c;
		this.m = m;
		this.e = e;
		this.sum = c + m + e;
	}
}

//排序类
class Compare implements Comparator<Student>{

	@Override
	public int compare(Student s1,Student s2) {
		// TODO Auto-generated method stub
		if(s1.sum > s2.sum) {
			return -1;
		}else if(s1.sum < s2.sum) {
			return 1;
		}else {
			if(s1.c > s2.c) {
				return -1;
			}else if(s1.c < s2.c) {
				return 1;
			}else {
				return Integer.compare(s1.num, s2.num);
			}
		}
	}
}

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		
		Student[] students = new Student[n+1];
		for(int i=1;i<=n;i++) {
			int c = sc.nextInt();
			int m = sc.nextInt();
			int e = sc.nextInt();
			students[i] = new Student(i,c,m,e);
		}
		sc.close();
		Arrays.sort(students,1,n+1,new Compare());
		for(int i=1;i<=5;i++) {
			System.out.println(students[i].num + " " +students[i].sum);
		}
		
	}

}

P1781 宇宙总统

CPP

#include <iostream>
#include <algorithm>

using namespace std;

struct president{
	int num;	//号数
	string sum;	//票数
	int len;	//位数 
}p[25];

bool cmp(president a,president b){
	if(a.len > b.len){
		return 1;//1不交换 
	}
	if(a.len == b.len && a.sum > b.sum){//位数相同,字典序前比后大,也不交换 
		return 1;
	}
	return 0; 
}

int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		p[i].num = i;
		cin>>p[i].sum;
		p[i].len = p[i].sum.size();
	}
	sort(p+1,p+1+n,cmp);
	cout<<p[1].num<<endl;
	cout<<p[1].sum<<endl;
	return 0;
}

Java

package P1781;

import java.math.BigInteger;
import java.util.Scanner;


public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		BigInteger max = BigInteger.ZERO;
		int index = 0;
		for(int i=1;i<=n;i++) {
			BigInteger ticket = sc.nextBigInteger();
			if(max.compareTo(ticket) == -1) {
				max = ticket;
				index = i;
			}
		}
		System.out.println(index);
		System.out.println(max);
		sc.close();
	}

}

P2676 [USACO07DEC] Bookshelf B

CPP

#include <iostream>
#include <algorithm>

using namespace std;
int N,B;//奶牛个数和书架身高 

bool cmp(int a,int b){
	return a>b;
}

int main(){
	cin>>N>>B;
	int h[N] = {0}; 
	for(int i=0;i<N;i++){
		cin>>h[i];
	}
	sort(h,h+N,cmp);
	int sum=0,ans=0;
	while(sum < B){
		sum += h[ans];
		ans++;
	}
	cout<<ans;
	return 0;
}

Java

package P2676;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class Compare implements Comparator<Integer>{

	@Override
	public int compare(Integer arg0, Integer arg1) {
		// TODO Auto-generated method stub
		if(arg0.intValue() > arg1.intValue()) {
			return -1;
		}else {
			return 1;
		}
	}
	
}

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n,b;
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		b = sc.nextInt();
		Integer[] h = new Integer[n];
		for(int i=0;i<n;i++) {
			h[i] = sc.nextInt();
		}
		Arrays.sort(h,0,n,new Compare());
		int sum=0,ans=0;
		while(sum < b) {
			sum += h[ans];
			ans++;
		}
		System.out.println(ans);
	}

}

P1116 车厢重组

CPP

#include <iostream>

using namespace std;
int n;
//求逆序对问题 
int main(){
	cin>>n;
	int a[n];
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	int ans=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<=i;j++){
			if(a[i] < a[j]){
				ans++;
			}
		}
	}
	cout<<ans;
	return 0;
}

Java

package P1116;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n,ans=0;
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		int a[] = new int[n];
		for(int i=0;i<n;i++) {
			a[i] = sc.nextInt();
		}
		for(int i=0;i<n;i++) {
			for(int j=0;j<=i;j++) {
				if(a[i] < a[j]) {
					ans++;
				}
			}
		}
		System.out.println(ans);
	}

}

P1152 欢乐的跳

CPP

#include <iostream>
#include <algorithm>

using namespace std;

int main(){
	int n;
	int a[1010];
	cin>>n;
	int c[n];
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<n;i++){
		c[i] = abs(a[i] - a[i+1]);
	}
	sort(c+1,c+n);
	for(int i=1;i<n;i++){
		if(i != c[i]){
			cout<<"Not jolly";
			return 0;
		}
	}
	cout<<"Jolly"<<endl;
	return 0;
}

Java

package P1152;

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n;
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		int a[] = new int[n+1];
		int c[] = new int[n];
		for(int i=1;i<=n;i++) {
			a[i] = sc.nextInt();
		}
		for(int i=1;i<n;i++) {
			c[i] = Math.abs(a[i] - a[i+1]);
		}
		Arrays.sort(c);
		int flag = 0;
		for(int i=1;i<n;i++) {
			if(i != c[i]) {
				flag = 1;
			}
		}
		if (flag == 1) {
			System.out.println("Not jolly");
		}else {
			System.out.println("Jolly");
		}
		
	}
}

P1068 [NOIP2009 普及组] 分数线划定

CPP

#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;
int n,m;

struct student{
	int num;
	int socre;
}s[5010];

int cmp(student s1,student s2){
	if(s1.socre < s2.socre){
		//小于要换 
		return 0;
	}else{
		if(s1.socre == s2.socre && s1.num > s2.num) {
			//分数相等的前提下,序号从小到大排列,大于要换 
			return 0;
		}
	}
}

int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>s[i].num;
		cin>>s[i].socre;
	}
	int line = m * 3/2;
	sort(s,s+n,cmp);
	int lineScore = s[line-1].socre;
	int count=0;
	for(int i=0;i<n;i++){
		if(s[i].socre >= lineScore){
			count++;
		}else{
			break;
		}
	}
	cout<<lineScore<<" "<<count<<endl;
	for(int i=0;i<count;i++){
		if(s[i].socre >= lineScore){
			cout<<s[i].num<<" "<<s[i].socre<<endl;
		}
	}
	
	return 0;
} 

Java

Sorry!好像没写

P5143 攀爬者

CPP

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

struct Node{
	double x;
	double y;
	double z;
	//运算符重载 
	bool operator<(const Node &b) const
      { 
      //1不用换 
		return z < b.z;
	  }
}p[50050];

int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
	}
	sort(p,p+n);
	double ans=0;
	double cx = p[0].x;
	double cy = p[0].y;
	double cz = p[0].z;
	for(int i=1;i<n;i++){
		ans+=sqrt(abs(cx-p[i].x)*abs(cx-p[i].x)+abs(cy-p[i].y)*abs(cy-p[i].y)+abs(cz-p[i].z)*abs(cz-p[i].z));//两点的欧几里得距离
		cx = p[i].x;
		cy = p[i].y;
		cz = p[i].z;
	}
	printf("%.3lf\n",ans);
	return 0;
}

Java

package P5143;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class Node{
	double x,y,z;
}

class Compare implements Comparator<Node>{

	@Override
	public int compare(Node arg0, Node arg1) {
		// TODO Auto-generated method stub
		if(arg0.z < arg1.z) {
			//小于不用换
			return 1;
		}else {
			//大于要换
			return -1;
		}
	}
	
}

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n;
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		Node p[] = new Node[n];
		for(int i=0;i<n;i++) {
			p[i] = new Node();
			p[i].x = sc.nextDouble();
			p[i].y = sc.nextDouble();
			p[i].z = sc.nextDouble();
		}
		Arrays.sort(p,0,n,new Compare());
		double ans=0;
		double cx = p[0].x;
		double cy = p[0].y;
		double cz = p[0].z;
		for(int i=1;i<n;i++) {
			ans += Math.sqrt(Math.pow(Math.abs(cx - p[i].x), 2)
					+ Math.pow(Math.abs(cy - p[i].y), 2)
					+ Math.pow(Math.abs(cz - p[i].z), 2));
			cx = p[i].x;
			cy = p[i].y;
			cz = p[i].z;
		}
		System.out.println(String.format("%.3f", ans));
	}

}

P1104 生日

CPP

#include <iostream>
#include <algorithm> 
#include <cstring>

using namespace std;

struct Node{
	string name;
	int year;
	int m;
	int d;
	int i;	//输出先后顺序 
}p[105];

int cmp(Node a,Node b){
	if(a.year < b.year){//比年 
		return 1;
	}else if(a.year == b.year){
		if(a.m < b.m){	//比月 
			return 1;
		}else if(a.m == b.m){
			if(a.d < b.d){	//比日 
				return 1;
			}else if(a.d == b.d){
				if(a.i > b.i){	//比编号 
					return 1;
				}
			} 
		}
	}
	return 0;
}

int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>p[i].name;
		cin>>p[i].year;
		cin>>p[i].m;
		cin>>p[i].d;
		p[i].i = i;
	}
	sort(p,p+n,cmp);
	for(int i=0;i<n;i++){
		cout<<p[i].name<<endl;
	}
	return 0;
} 

Java

package P1104;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class Student{
	String name;
	int year,m,d;
	int level;
}

class Compare implements Comparator<Student>{

	@Override
	public int compare(Student o1, Student o2) {
		// TODO Auto-generated method stub
		if(o1.year < o2.year) {
			return -1;
		}else if(o1.year == o2.year) {
			if(o1.m < o2.m) {
				return -1;
			}else if(o1.m == o2.m) {
				if(o1.d < o2.d) {
					return -1;
				}else if(o1.d == o2.d) {
					if(o1.level > o2.level) {
						return -1;
					}
				}
			}
		}
		return 1;
	}
	
}
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n;
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		Student p[] = new Student[n];
		for(int i=0;i<n;i++) {
			p[i] = new Student();
			p[i].name = sc.next();
			p[i].year = sc.nextInt();
			p[i].m = sc.nextInt();
			p[i].d = sc.nextInt();
			p[i].level = i;
		}
		Arrays.sort(p,0,n,new Compare());
		for(int i=0;i<n;i++) {
			System.out.println(p[i].name);
		}
	}

}

P1012 [NOIP1998 提高组] 拼数

CPP

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
int n;

int cmp(string &a,string &b){
	if(a+b > b+a){
		return 1;
	}
	return 0;
}
int main(){
	cin>>n;
	string a[n];
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	sort(a,a+n,cmp);
	for(int i=0;i<n;i++){
		cout<<a[i];
	}
	return 0;
}

Java

package P1012;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class Compare implements Comparator<String>{

	@Override
	public int compare(String o1, String o2) {
		// TODO Auto-generated method stub
		int result = o1.concat(o2).compareTo(o2.concat(o1));
		return result > 0?-1:1;
	}
	
}

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n;
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		String a[] = new String[n];
		int temp;
		for(int i=0;i<n;i++) {
			temp = sc.nextInt();
			a[i] = String.valueOf(temp);
		}
		Arrays.sort(a,0,n,new Compare());
		for(int i=0;i<n;i++) {
			System.out.print(a[i]);
		}
	}

}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ajax小王子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值