0x05.基本算法 - 排序

声明:
本系列博客是《算法竞赛进阶指南》+《算法竞赛入门经典》+《挑战程序设计竞赛》的学习笔记,主要是因为我三本都买了 按照《算法竞赛进阶指南》的目录顺序学习,包含书中的少部分重要知识点、例题解题报告及我个人的学习心得和对该算法的补充拓展,仅用于学习交流和复习,无任何商业用途。博客中部分内容来源于书本和网络(我尽量减少书中引用),由我个人整理总结(习题和代码可全都是我自己敲哒)部分内容由我个人编写而成,如果想要有更好的学习体验或者希望学习到更全面的知识,请于京东搜索购买正版图书:《算法竞赛进阶指南》——作者李煜东,强烈安利,好书不火系列,谢谢配合。


下方链接为学习笔记目录链接(中转站)

学习笔记目录链接


ACM-ICPC在线模板


1.AcWing 103. 电影

在这里插入图片描述

离散化
因为语言种类太多了,而实际用到的语言只有n+m种,实际上对答案产生影响的只有n种科学家会的语言。所以对n个科学家会的语言直接进行离散化,将语言压缩到n种就行了。重载一下运算符排序得最大值即可。

#include<iostream>
#include<bits/stdc++.h>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<bitset>
#include<limits.h>
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)
#define over(i,s,t) for(register int i = s;i <= t;++i)
#define lver(i,t,s) for(register int i = t;i >= s;--i)
//#define int __int128
using namespace std;
#undef mid
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,int> PLI;

const int N = 200007;
const ll mod = 1e9+7;
const ll INF = 1e15+7;
const double EPS = 1e-10;
const int base = 131;

struct node{
    int a,b,c;
    bool operator<(const node &t)const{
        if(a == t.a)
            return b>t.b;
        return a>t.a;
    }
}ans[N];
unordered_map<int,int>vis,sum;
int n,m,cnt,t;
int main()
{
    scanf("%d",&n);
    over(i,1,n){
        scanf("%d",&t);
        if(!vis[t]){
           vis[t] = ++cnt;
           t = cnt;
        }
        else t = vis[t];
        sum[t]++;
    }
    scanf("%d",&m);
    over(i,1,m){
        int x;
        scanf("%d",&x);
        x = vis[x];
        ans[i].a = sum[x];
        ans[i].c = i;
    }
    over(i,1,m){
        int x;
        scanf("%d",&x);
        x = vis[x];
        ans[i].b = sum[x];
        ans[i].c = i;
    }
    sort(ans+1,ans+1+m);
    cout<<ans[1].c;
    return 0;
}

2.AcWing 104. 货仓选址

在这里插入图片描述
就是中位数的性质,直接求中位数即可。

#include<iostream>
#include<bits/stdc++.h>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<bitset>
#include<limits.h>
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)
#define over(i,s,t) for(register int i = s;i <= t;++i)
#define lver(i,t,s) for(register int i = t;i >= s;--i)
//#define int __int128
using namespace std;
#undef mid
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,int> PLI;

const int N = 100007;
const ll mod = 1e9+7;
const ll INF = 1e15+7;
const double EPS = 1e-10;
const int base = 131;


int n,m,ans;
int a[N];
int mid = 0;
int main()
{
    scanf("%d",&n);
    over(i,1,n){
        scanf("%d",&a[i]);
    }
    sort(a+1,a+1+n);
    mid = a[n/2+1];
    over(i,1,n)
    ans += abs(mid-a[i]);
    printf("%d\n",ans);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章