BZOJ3112 [ZJOI2013]防守战线

Description

战线可以看作一个长度为 n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第 i号位置上建一座塔有 Ci 的花费,且一个位置可以建任意多的塔费用累加计算。有 m个区间[L1, R1], [L2, R2], …, [Lm, Rm],在第 i 个区间的范围内要建至少 Di座塔。求最少花费。

Input

第一行为两个数n,m。

接下来一行,有 n个数,描述 C数组。

接下来 m行,每行三个数 Li,Ri,Di,描述一个区间。

Output

仅包含一行,一个数,为最少花费。

Sample Input

5 3

1 5 6 3 4

2 3 1

1 5 4

3 5 2

Sample Output

11

Hint

样例提示:

位置 1建 2个塔,位置 3建一个塔,位置 4建一个塔。花费 1*2+6+3=11。

数据范围:

对于 20%的数据,n≤20,m≤20。

对于 50%的数据(包括上部分的数据),Di 全部为1。

对于 70%的数据(包括上部分的数据),n≤100,m≤1000。

对于 100%的数据,n≤1000,m≤10000,1≤Li≤Ri≤n,其余数据均≤10000。

Source

ZJOI2013

网络流, 线性规划,单纯形

正解:线性规划单纯形

解题报告:这种鬼东西我说不了太多,蒟蒻我只会模板

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#define RG register
const double eps = 1e-9;
const double inf = 1e20;

using namespace std;

int gi(){
	char ch=getchar();int x=0;
	while(ch<‘0‘ || ch>‘9‘) ch=getchar();
	while(ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
	return x;
}

int n,m;
double a[1050][10050];
int b[10050];

void pivot(int l,int e){
	double k=a[l][e];a[l][e]=1;
	for (RG int i=0; i<=n; ++i) a[l][i]/=k;
	int len=0;
	for (RG int i=0; i<=n; ++i) if (fabs(a[l][i])>eps) b[++len]=i;
	for (RG int i=0; i<=m; ++i)
		if (i!=l && fabs(a[i][e])>eps){
			k=a[i][e];a[i][e]=0;
			for (RG int j=1; j<=len; ++j) a[i][b[j]]-=k*a[l][b[j]];
		}
}

double simplex(){
	while(1){
		RG int l,e;
		for (e=1; e<=n; ++e) if (a[0][e]>eps) break;
		if (e==n+1) return -a[0][0];
		double tmp=inf;
		for (RG int i=1; i<=m; ++i)
			if (a[i][e]>eps && a[i][0]/a[i][e]<tmp) tmp=a[i][0]/a[i][e],l=i;
		if (tmp==inf) return inf;
		pivot(l,e);
	}
}

int main(){
	n=gi(),m=gi();
	for (RG int i=1; i<=n; ++i) a[i][0]=gi();
	for (RG int i=1; i<=m; ++i){
		int l=gi(),r=gi();
		for (RG int j=l; j<=r; ++j) a[j][i]=1;
		a[0][i]=gi();
	}
	swap(n,m);
	printf("%lld",(long long)(floor(simplex()+0.5)));
}
时间: 2024-08-02 10:55:56

BZOJ3112 [ZJOI2013]防守战线的相关文章

单纯形 BZOJ3112: [Zjoi2013]防守战线

题面自己上网查. 学了一下单纯形.当然 证明什么的 显然是没去学.不然估计就要残废了 上学期已经了解了 什么叫标准型. 听起来高大上 其实没什么 就是加入好多松弛变量+各种*(-1),使得最后成为一般形式: 给定A[][],求满足A[i][j]*Xj<=A[i][0];(0<i<=n,0<j<=m) 使A[0][j]*Xj最大的X[]: 如果题面中直接得出的条件是A[i][j]*Xj>=A[i][0]; 使 A[0][j]*Xj最小. 那么就要用对偶定理,变成 A[i]

bzoj3550: [ONTAK2010]Vacation&amp;&amp;bzoj3112: [Zjoi2013]防守战线

学了下单纯形法解线性规划 看起来好像并不是特别难,第二个code有注释.我还有...*=-....这个不是特别懂 第一个是正常的,第二个是解对偶问题的 #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; const double e

BZOJ 3112: [Zjoi2013]防守战线 [单纯形法]

题目描述 战线可以看作一个长度为n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第i 号位置上建一座塔有Ci 的花费,且一个位置可以建任意多的塔,费用累加计算.有m 个区间[L1, R1], [L2, R2], …, [Lm, Rm],在第i 个区间的范围内要建至少Di 座塔.求最少花费. 输入输出格式 输入格式: 第一行为两个数n, m. 接下来一行,有n 个数,描述C 数组. 接下来m 行,每行三个数Li,Ri,Di,描述一个区间. 输出格式: 仅包含一行,一个数,为最少花费. 输入输

[ZJOI2013]防守战线

题目描述 战线可以看作一个长度为n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第i 号位置上建一座塔有Ci 的花费,且一个位置可以建任意多的塔,费用累加计算.有m 个区间[L1, R1], [L2, R2], …, [Lm, Rm],在第i 个区间的范围内要建至少Di 座塔.求最少花费. 输入输出格式 输入格式: 第一行为两个数n, m. 接下来一行,有n 个数,描述C 数组. 接下来m 行,每行三个数Li,Ri,Di,描述一个区间. 输出格式: 仅包含一行,一个数,为最少花费. 输入输

数学(线性规划): ZJOI2013 防守战线

偷懒用的线性规划. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int maxr=1010; 6 const int maxc=10010; 7 8 int n,m,nxt[maxc]; 9 int a[maxr][maxc]; 10 11 12 void Pivot(int l,int e){ 13 int pre=maxc-

BZOJ 3112 Zjoi2013 防守战线 单纯形

题目大意: 单纯形*2... #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define EPS 1e-7 #define INF 1e10 using namespace std; int n,m; namespace Linear_Programming{ double A[1010][10100]

BZOJ 3112 [Zjoi2013]防守战线 线性规划

题意: 简单叙述: 一个长度为n的序列,在每个点建塔的费用为Ci,有m个区间,每个区间内至少有Dj个塔,求最小花费. 方法:线性规划 解析: 与上一题类似,同样使用对偶原理解题,解法不再赘述. 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 1010 #define M 10010 #define INF 0x7f7f7f7

单纯形法与线性规划

Preface 好久之前就想学学单纯形法了,因为据说用途非常广泛,而且最近恰好要做有关的题目 感觉还是挺高级的一个姿势吧,以下参考自一,二以及2016年的集训队论文,最后看的是bzt的板子,默认大家都知道线性规划是什么且具有一定线性代数的基础(好把没有也没有关系) 线性规划的标准型与松弛型 线性规划的标准型一般是这样的: 而松弛型是这样的: 桥豆麻袋,上面的标准型我能理解,这个松弛型是个什么鬼东西,怎么让变量更多了呢? 不要慌我们来观察一下,标准型简洁是简洁,但是它的约束符号是不等号(小于等于)

徐家骏:我在华为工作十年的感悟 (转)

徐是华为数据中心的头,技术超级牛人,一级部门总监,华为副总裁,年收入过千万,数据中心是用火山岩建的深入地下的一个大型建筑.防辐射,可防卫星的电子,雷达等手段的侦察.里面有象卫星发射中心那种超大屏幕,机房里满是三米的大型服务器和大型计算机.连接整个华为全球的每一台终端,整个华为每天三十多万封邮件,海外和全球的同步研发,内部的信息管理,内部流程,华为的国内国际IP电话都是通过出去. 上周,我正式提交了离职报告,准备给自己的职业生涯一个很大的转折,这是我长时间的思考最后所做的决定.但真的提出离职后,回