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;
}

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