洛谷 P2507 [SCOI2008]配对

传送门

(讲道理)一道很简单的题,可惜我实在zz到了一种境界。

首先都可以匹配的情况下,两个数组分别排个序对应匹配肯定是最优的,实在太蠢的我不知道如何证明,就画了个丑陋的图。

可以发现不交叉一定不会更劣。

然后有一些是不能匹配的情况下,容易想到到肯定是跟它附近的几个交换。发现最多也不会跟它距离超过2的匹配,如图:

若是D和E匹配,一定不是最优。

考虑把三把叉中的一把拆掉,最坏情况下,A,B,C中的一个等于E,不能换,D等于另一个F,G,H中的一个,不能换,也就是两个交叉的可能都无法拆,但是是三个的话一定至少有一个可拆。

然后就直接dp搞了。

//Twenty
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
#include<ctime>
#define INF 0xfffffff
typedef long long LL;
using namespace std;
const int maxn=1e5+5;
int n;
LL f[maxn],a[maxn],b[maxn];

template<typename T> void read(T &x) {
	char ch=getchar(); T f=1; x=0;
	while(ch!=‘-‘&&(ch<‘0‘||ch>‘9‘)) ch=getchar();
	if(ch==‘-‘) f=-1,ch=getchar();
	for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘;
	x*=f;
}

LL c(int i,int j) {
	LL res=abs(a[i]-b[j]);
	return res==0?INF:res;
}

void work() {
	sort(a+1,a+n+1);
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++) {
		f[i]=f[i-1]+c(i,i);
		if(i>1) f[i]=min(f[i],f[i-2]+c(i,i-1)+c(i-1,i));
		if(i>2) f[i]=min(f[i],f[i-3]+c(i,i-2)+c(i-1,i-1)+c(i-2,i));
		if(i>2) f[i]=min(f[i],f[i-3]+c(i,i-2)+c(i-1,i)+c(i-2,i-1));
		if(i>2) f[i]=min(f[i],f[i-3]+c(i,i-1)+c(i-1,i-2)+c(i-2,i));
	}
	printf("%lld\n",f[n]);
}

void init() {
	read(n);
	for(int i=1;i<=n;i++) { read(a[i]); read(b[i]); }
}

int main() {
#ifdef DEBUG
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
#endif
	init();
	work();
	return 0;
}

  

时间: 2024-08-30 08:22:32

洛谷 P2507 [SCOI2008]配对的相关文章

洛谷 P2756 飞行员配对方案问题

题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于给定的外籍飞行员与英国飞行员的配合情况,编程找

洛谷P2474 [SCOI2008]天平

P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边.问:有多少种选法使得天平的左边重(c1).一样重(c2).右边重(c3)?(只有结果保证惟一的选法才统计在内) 输入输出格式 输入格式: 第一行包含三个正整数n,A,B(1<=A,B<=N,A 和B 不相等).砝码编号 为1~N.以下n行

网络流24题 第一题 - 洛谷2756 飞行员配对方案 二分图匹配 匈牙利算法

欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 题意概括 裸的二分图匹配 题解 匈牙利算法 上板子 代码 #include <cstring> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cmath> using namespace std; const int N=100+5; int m,n,a,b,match[N

[洛谷P2756]飞行员配对方案问题

题目大意:有m个外籍飞行员和n个英国飞行员,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.现在一架飞机要一名外籍飞行员和一名英国飞行员开,且他们必须有默契,求一次最多能开出多少飞机. 解题思路:明显二分图匹配,我用的匈牙利算法(当然网络流也可以,只不过代码量会大一点). C++ Code: #include<bits/stdc++.h> using namespace std; int m,n,s; bool b[105][105],used[105]; int lft[105];

洛谷P2476 [SCOI2008]着色方案

题目:https://daniu.luogu.org/problemnew/show/P2476 题目背景 四川NOI省选第二试 题目描述 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的着色方案. 输入输出格式 输入格式: 第一行为一个正整数k,第二行包含k个整数c1, c2, ... , ck. 输出

洛谷 2476 [SCOI2008]着色方案

50%的数据满足:1 <= k <= 5, 1 <= ci <= 3 100%的数据满足:1 <= k <= 15, 1 <= ci <= 5 [题解] 本题中ci很小,因此可以直接5维保存可以涂i块的油漆有多少种颜色.然后利用乘法原理进行DP 1 #include<cstdio> 2 #include<algorithm> 3 #define LL long long 4 #define rg register 5 #define

网络流24题 洛谷 2756 飞行员配对方案

代码风格迥异 -- 1 #include<bits/stdc++.h> 2 3 const int N=1000+5; 4 5 using namespace std; 6 7 int link[N],g[N][N],ansx[N]; 8 int n,m,u,v,ans; 9 bool vis[N]; 10 11 inline void read( int&x ) { 12 int f=1;x=0;char c=getchar(); 13 while(c>'9'||c<'0

[洛谷OJ] P1114 “非常男女”计划

洛谷1114 “非常男女”计划 本题地址:http://www.luogu.org/problem/show?pid=1114 题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验.例如,据他观察,身高相近的人似乎比较合得来. 万圣节来临之际,XXX准备在学校策划一次大型的“非常男女”配对活动.对于这次活动的参与者,XXX有自己独特的选择方式.他希望能选择男女人数相等且身高都很接近的一些人.这种选择方式实现起来很简单.

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3