首页 > 编程语言 >基础算法训练题单之排序(从入门到入土)——题解

基础算法训练题单之排序(从入门到入土)——题解

时间:2024-07-08 22:08:01浏览次数:18  
标签:int 题解 sum 题单 cin long 入土 include define

  1. A. P1177 【模板】排序

三种方法:快速排序,归并排序,STL库的sort函数。

法一、三:https://www.cnblogs.com/expect-999/p/17594345.html

法二:https://www.cnblogs.com/expect-999/p/17599008.html

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

模板题目,直接对数组进行升序排序,如果数组从零开始,则找到下标为k-1的数,从1开始的就找第K个数。
https://www.cnblogs.com/expect-999/p/18143416

  1. C. P1271 【深基9.例1】选举学生会
    直接对数组按升序排序输出即可。
点击查看C题代码
#define _CRT_SECURE_NO_WARNINGS 1

#define all(C) C.begin(),C.end()
#define S second
#define F first
#define PB push_back
#define mod 1000000007
#define import ios_base::sync_with_stdio(false);cin.tie(NULL)

#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
const int N = 2e6 + 10;

int q[N];

void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;

    int i = l - 1, j = r + 1;
    int x = q[l + r >> 1];

    while (i < j)
    {
        do ++i; while (q[i] < x);
        do --j; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }

    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
}

signed main()
{
    import;
    int n, m;
    cin >> n >> m;

    for (int i = 0; i < m; ++i) cin >> q[i];

    quick_sort(q,0,m-1);

    for (int i = 0; i < m; ++i) cout << q[i] << ' ';

    return 0;
}
  1. D. [NOIP2006 普及组] 明明的随机数
    对数组进行排序,再用unique函数进行去重(这个去重其实就是重复的数字移到后面去了,并不是真正的去重)
点击查看D题代码
#define _CRT_SECURE_NO_WARNINGS 1

#define all(C) C.begin(),C.end()
#define S second
#define F first
#define PB push_back
#define mod 1000000007
#define import ios_base::sync_with_stdio(false);cin.tie(NULL)

#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
const int N = 2e6 + 10;

int q[N];

void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;

    int i = l - 1, j = r + 1;
    int x = q[ (l + r) >> 1];

    while (i < j)
    {
        do ++i; while (q[i] < x);
        do --j; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }

    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
}

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

    for (int i = 0; i < n; ++i) cin >> q[i];

    quick_sort(q,0,n-1);

    int k = unique(q,q + n) - q; //unique"去掉"重复的,其实返回去重后最后一个不重复元素地址
                                 //再减去首地址就是下标,
    cout << k << endl;
    for (int i = 0; i < k; ++i) cout << q[i] << " ";

    return 0;
}
  1. E. [NOIP2007 普及组] 奖学金
    利用sort和结构体来进行排序————当一个模板题理解记忆就好了。
点击查看E题代码
#define _CRT_SECURE_NO_WARNINGS 1

#define all(C) C.begin(),C.end()
#define S second
#define F first
#define PB push_back
#define mod 1000000007
#define import ios_base::sync_with_stdio(false);cin.tie(NULL)

#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
const int N = 2e6 + 10;

struct stu
{
    int Id;
    int chinese;
    int math;
    int eglish;
    int sum;
}q[N];

bool cmp(stu a, stu b)
{
    if (a.sum != b.sum) return a.sum > b.sum;
    else if (a.chinese != b.chinese) return a.chinese > b.chinese;
    else return a.Id < b.Id;
}

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

    for (int i = 1; i <= n; ++i)
    {
        cin >> q[i].chinese >> q[i].math >> q[i].eglish;
        q[i].Id = i;
        q[i].sum = q[i].chinese + q[i].math + q[i].eglish;
    }

    sort(q + 1, q + n + 1, cmp);

    for (int i = 1; i <= 5; ++i) printf("%d %d\n", q[i].Id, q[i].sum);

    return 0;
}
  1. F. 宇宙总统
    同上一题一样
点击查看F题代码
#define _CRT_SECURE_NO_WARNINGS 1

#define all(C) C.begin(),C.end()
#define S second
#define F first
#define PB push_back
#define mod 1000000007
#define import ios_base::sync_with_stdio(false);cin.tie(NULL)

#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
const int N = 2e6 + 10;

int n;

struct stu
{
    int id;
    int size;
    string x;
}q[N];

bool cmp(stu a, stu b)
{
    if (a.size != b.size) return a.size > b.size;
    else return a.x > b.x;
}

signed main()
{

    cin >> n;

    for (int i = 1; i <= n; i++)
    {
        cin >> q[i].x;
        q[i].id = i ;
        q[i].size = (q[i].x).size();
    }

    sort(q + 1, q + n + 1, cmp);

    cout << q[1].id << endl;
    cout << q[1].x << endl;
}
  1. G. [USACO07DEC] Bookshelf B
点击查看G题代码
#define _CRT_SECURE_NO_WARNINGS 1

#define all(C) C.begin(),C.end()
#define S second
#define F first
#define PB push_back
#define mod 1000000007
#define import ios_base::sync_with_stdio(false);cin.tie(NULL)

#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
const int N = 2e6 + 10;

int n,cnt;
int q[N];

ll h,sum;

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

signed main()
{

    cin >> n >> h;

    for (int i = 0; i < n; ++i) cin >> q[i];

    sort(q, q + n, cmp);

    for (int i = 0; i < n; ++i)
    {
        if (sum < h)
        {
            sum += q[i];
            cnt++;
        }
        else break;
    }

    cout << cnt << endl;

    return 0;
}
  1. H. 车厢重组
点击查看H题代码
#define _CRT_SECURE_NO_WARNINGS 1

#define all(C) C.begin(),C.end()
#define S second
#define F first
#define PB push_back
#define mod 1000000007
#define import ios_base::sync_with_stdio(false);cin.tie(NULL)

#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
const int N = 2e6 + 10;

int n;
int q[N],p[N];

ll cnt;

void merge_sort(int q[], int l, int r)
{
    if (l >= r) return;
    
    int mid = l + r >> 1;

    merge_sort(q, l, mid);
    merge_sort(q, mid + 1, r);

    int i = l, j = mid+1,k=0;
    while (i<=mid && j<=r)
    {
       if(q[i]<=q[j])  p[k++] = q[i++];
       else
       {
           p[k++] = q[j++];
           cnt += mid - i + 1;
       }
    }

    while (i <= mid) p[k++] = q[i++];
    while (j <= r) p[k++] = q[j++];

    for (int i = l, k = 0; i <= r;++i) q[i] = p[k++];

}

signed main()
{

    cin >> n;

    for (int i = 0; i < n; ++i) cin >> q[i];

    merge_sort(q, 0, n-1);

    cout << cnt << endl;

    return 0;
}
  1. I. 欢乐的跳
点击查看I题代码
#define _CRT_SECURE_NO_WARNINGS 1

#define all(C) C.begin(),C.end()
#define S second
#define F first
#define PB push_back
#define mod 1000000007
#define import ios_base::sync_with_stdio(false);cin.tie(NULL)

#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
const int N = 2e6 + 10;

int n, cnt;
int q[N], p[N];

signed main()
{

    cin >> n;

    for (int i = 0; i < n; ++i) cin >> q[i];

    for (int i = 0; i < n - 1; ++i) p[++cnt] = abs(q[i] - q[i + 1]);

    sort(p + 1, p + cnt + 1);

    int ok = 1;
    for (int i = 1; i < n; ++i)
    {
        if (p[i] != i)
        {
            ok = 0;
            break;
        }
    }

    if (ok) cout << "Jolly" << endl;
    else cout << "Not jolly" << endl;

    return 0;
}
  1. J. [NOIP2009 普及组] 分数线划定
点击查看J题代码
#define _CRT_SECURE_NO_WARNINGS 1

#define all(C) C.begin(),C.end()
#define S second
#define F first
#define PB push_back
#define mod 1000000007
#define import ios_base::sync_with_stdio(false);cin.tie(NULL)

#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
const int N = 2e6 + 10;

int n, m;

struct stu
{
    int v;
    int p;
}q[N];

bool cmp(stu a, stu b)
{
    if (a.p == b.p) return a.v < b.v;
    else return a.p > b.p;
}

signed main()
{

    cin >> n >> m;

    for (int i = 1; i <= n; ++i) cin >> q[i].v >> q[i].p;

    int k = m * 1.5;

    sort(q+1, q + n + 1, cmp);

    for (int i = k; i <= n; ++i)
    {
        if (q[i].p == q[i + 1].p) k++;
        else break;
    }

    printf("%d %d\n", q[k].p, k);
    for (int i = 1; i <= k; ++i) printf("%d %d\n", q[i].v, q[i].p);

    return 0;
}
  1. K. 攀爬者
点击查看K题代码
#define _CRT_SECURE_NO_WARNINGS 1

#define all(C) C.begin(),C.end()
#define S second
#define F first
#define PB push_back
#define mod 1000000007
#define import ios_base::sync_with_stdio(false);cin.tie(NULL)

#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
const int N = 2e6 + 10;

int n, m;
double sum;

struct stu
{
    int x;
    int y;
    int z;
}q[N];

bool cmp(stu a, stu b)
{
    return a.z < b.z;
}

signed main()
{

    cin >> n ;

    for (int i = 0; i < n; ++i) cin >> q[i].x >> q[i].y >> q[i].z;

    sort(q, q + n, cmp);

    for (int i = 0; i < n-1; ++i)
    {
        int x1 = pow(q[i].x - q[i + 1].x, 2);
        int y1 = pow(q[i].y - q[i + 1].y, 2);
        int z1 = pow(q[i].z - q[i + 1].z, 2);
        double p = pow(x1 + y1 + z1, 1.0 / 2);
        sum += p;
    }

    printf("%.3lf", sum);

    return 0;
}
  1. L. 生日
点击查看L题代码
#define _CRT_SECURE_NO_WARNINGS 1

#define all(C) C.begin(),C.end()
#define S second
#define F first
#define PB push_back
#define mod 1000000007
#define import ios_base::sync_with_stdio(false);cin.tie(NULL)

#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
const int N = 2e6 + 10;

int n, m;
double sum;

struct stu
{
    string name;
    int year;
    int month;
    int day;
    int id;
}q[N];

bool cmp(stu a, stu b)
{
    if (a.year != b.year) return a.year < b.year;
    else if (a.month != b.month) return a.month < b.month;
    else if (a.day != b.day) return a.day < b.day;
    else return a.id > b.id;
}

signed main()
{

    cin >> n ;

    for (int i = 0; i < n; ++i)
    {
        cin >> q[i].name >> q[i].year >> q[i].month >> q[i].day;
        q[i].id = i;
    }

    sort(q, q + n, cmp);

    for (int i = 0; i < n; ++i) cout << q[i].name << endl;

    return 0;
}
  1. M. [NOIP1998 提高组] 拼数
点击查看M题代码
#define _CRT_SECURE_NO_WARNINGS 1

#define all(C) C.begin(),C.end()
#define S second
#define F first
#define PB push_back
#define mod 1000000007
#define import ios_base::sync_with_stdio(false);cin.tie(NULL)

#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
const int N = 2e6 + 10;

int n, m;
string q[N];

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

signed main()
{
    import;
    cin >> n;

    for (int i = 0; i < n; ++i) cin >> q[i];

    sort(q, q + n,cmp);

    for (int i = 0; i < n; ++i) cout << q[i];

    return 0;
}
  1. N. [NOIP2005 提高组] 谁拿了最多奖学金
点击查看N题代码
#define _CRT_SECURE_NO_WARNINGS 1

#define all(C) C.begin(),C.end()
#define S second
#define F first
#define PB push_back
#define mod 1000000007
#define import ios_base::sync_with_stdio(false);cin.tie(NULL)

#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
const int N = 1e5 + 10;

int n;

struct stu
{
	int id;
	string name;
	int egrade,pgrade;
	char cadre,west;
	int papernum;
	int sum;
}q[N];

bool cmp(stu a, stu b)
{
	if (a.sum != b.sum) return a.sum > b.sum;
	else return a.id < b.id;
}


signed main()
{

	cin >> n;

	for (int i = 0; i < n; ++i)
	{
		q[i].id = i;
		cin >> q[i].name >> q[i].egrade >> q[i].pgrade >> q[i].cadre >> q[i].west >> q[i].papernum;
		if (q[i].papernum >= 1 && q[i].egrade > 80) q[i].sum += 8000;
		if (q[i].egrade > 85 && q[i].pgrade > 80) q[i].sum += 4000;
		if (q[i].egrade > 90) q[i].sum += 2000;
		if (q[i].west == 'Y' && q[i].egrade > 85) q[i].sum += 1000;
		if (q[i].cadre == 'Y' && q[i].pgrade > 80) q[i].sum += 850;
	}

	sort(q, q + n,cmp);

	cout << q[0].name << endl;

	int ans = 0;
	for (int i = 0; i < n; ++i)
	{
		ans += q[i].sum;
	}

	printf("%d\n%d", q[0].sum,ans);

	return 0;
}
  1. O. [NOIP2011 普及组] 瑞士轮
    https://www.cnblogs.com/expect-999/p/18162711

  2. P. 逆序对
    https://www.cnblogs.com/expect-999/p/18143932

以上就是此次排序训练的全部内容了,希望你有所收获。

标签:int,题解,sum,题单,cin,long,入土,include,define
From: https://www.cnblogs.com/expect-999/p/18290781

相关文章

  • Codeforces Round 953(Div.2) 题解(A-E)
    CodeforcesRound953(Div.2)题解(A-E)A题意Alice有n本书,第一本书有\(a_1\)页,序号为1,第二本书有\(a_2\)页,序号为2,……,第n本书有\(a_n\)页,序号为n。Alice将把所有书分成两堆,并阅读每一堆中序号最大的一本书。Alice喜欢读书,请你告诉她,她最多可以读多少页的书。Solution第......
  • 题解:洛谷 P1890 gcd区间
    题解:洛谷P1890gcd区间标签:线段树,st表,分块,dp题意给定数列\(a\),有\(m\)次询问求区间\([l,r]\)的最大公约数。思路这道题有多种写法,如标签所示。线段树线段树可以维护具有结合性的操作,很明显\(\gcd\)满足。这道题线段树跑的慢是因为无修改操作,自然没有其他\(O(1)......
  • 题解:洛谷 P2678 [NOIP2015 提高组] 跳石头
    题解:洛谷P2678[NOIP2015提高组]跳石头标签:二分,贪心题意给定一个数列,\(a_0=0,a_{N+1}=L\),从其中删除不超过\(M\)个数,使得\(a_i-a_{i-1}\)的最小值最大。思路从最小值最大不难想到二分答案。统计\(a_i-a_j<mid\)的数量\(k\),如果不满足的话说明不删,\(j\getsi\)。......
  • VSCode中 npm install 安装依赖包太慢了,一直加载不出来问题解决
    1.问题描述采用VSCode打开别人传过来的项目时,需要先加载依赖包,一般是通过终端来加载:终端中输入npminstall. 但是采用npminstall安装依赖包出现问题,一直加载不完,卡到某一地方,如图: 2.尝试解决2.1采用淘宝镜像,依旧慢,最后证书过期2.2采用pnpminstall(做了一部分)npmins......
  • 题解:洛谷 P1843 奶牛晒衣服
    题解:洛谷P1843奶牛晒衣服标签:二分,贪心题意给定一个数列,每秒可以将所有数减\(a\),也可以选择一个数减\(b\),二者可同时进行,求让所有数小于等于\(0\)的最小秒数。思路要求最小的秒数,也就是刚好所有数字小于等于\(0\),且尽量大。这个秒数具有单调性,考虑二分答案。二分的......
  • CodeForces CF1980C Sofia and the Lost Operations 题解 但是最后TLE 仅供思路参考
    CodeForcesCF1980CSofiaandtheLostOperations题解嗨嗨,又来了啊,蒟蒻再来一篇题解SofiaandtheLostOperations题面翻译索菲亚有一个包含$n$个整数的数组$a[1],a[2],…,a[n]$。有一天她对这个数组感到厌倦,于是决定顺序地对其应用$m$个修改操作。每个修改操作由一......
  • 洛谷p1449后缀表达式题解
    #include<stdio.h>#include<stdlib.h>#defineMAXSIZE100typedeflongElemType;typedefstruct{ ElemType*base; ElemType*top; intStackSize;}sqStack;voidInitStack(sqStack*s){ s->base=(ElemType*)malloc (MAXSIZE*sizeof(ElemTyp......
  • 24暑期第三次训练C组题解
    目录A津津的储蓄计划auto遍历:B校门外的树memset()C杨辉三角DSpecialCharacters位运算&三目运算符EStrangeSplittingFStickogonGCardExchange构造结构体和重载运算符HLeastProductI选数JPeter的烟A津津的储蓄计划模拟题,按题意模拟即可.voidfunc(){ intjin......
  • WPF ComboBox数据绑定:初始化动态加载ItemsSource后首次赋值Text不显示问题解决
    原来:<ComboBoxText="{BindingItem}"ItemsSource="{BindingItemLists}"></ComboBox>privatevoidParas_Init(){ItemLists=newObservableCollection<string>();ItemLists.Add("111......
  • [BZOJ4350] 括号序列再战猪猪侠 题解
    我们设\(dp_{i,j}\)表示第\(i\)到第\(j\)个括号合并为序列且最外层不是括号\(i\)的可能性,\(f_{i,j}\)表示最外层是括号\(i\)的可能性。则有:\[\begin{cases}dp_{i,j}=\sumf_{i,k}(dp_{k+1,j}+f_{k+1,j})\\f_{i,j}=dp_{i+1,j}+f_{i+1,j}\end{cases}\]当然,并不是所......