聲明:
本系列博客是《算法競賽進階指南》+《算法競賽入門經典》+《挑戰程序設計競賽》的學習筆記,主要是因爲我三本都買了按照《算法競賽進階指南》的目錄順序學習,包含書中的少部分重要知識點、例題解題報告及我個人的學習心得和對該算法的補充拓展,僅用於學習交流和複習,無任何商業用途。博客中部分內容來源於書本和網絡(我儘量減少書中引用),由我個人整理總結(習題和代碼可全都是我自己敲噠)部分內容由我個人編寫而成,如果想要有更好的學習體驗或者希望學習到更全面的知識,請於京東搜索購買正版圖書:《算法競賽進階指南》——作者李煜東,強烈安利,好書不火系列,謝謝配合。
下方鏈接爲學習筆記目錄鏈接(中轉站)
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;
}