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