• 【BZOJ3112】[Zjoi2013]防守战线 单纯形法


    【BZOJ3112】[Zjoi2013]防守战线

    题解:依旧是转化成对偶问题,然后敲板子就行了~

    建完表后发现跟志愿者招募的表正好是相反的,感觉很神奇~

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    using namespace std;
    const double inf=1e12;
    const double eps=1e-6;
    double A[1010][10010];
    int p[10010];
    int n,m;
    int rd()
    {
    	int ret=0,f=1;	char gc=getchar();
    	while(gc<'0'||gc>'9')	{if(gc=='-')f=-f;	gc=getchar();}
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret*f;
    }
    void pivot(int l,int e)
    {
    	double t=A[l][e];A[l][e]=1;
    	int i,j;
    	for(j=0;j<=n;j++)	A[l][j]/=t;
    	for(p[0]=j=0;j<=n;j++)	if(fabs(A[l][j])>eps)	p[++p[0]]=j;
    	for(i=0;i<=m;i++)	if(i!=l&&fabs(A[i][e])>eps)
    	{
    		t=A[i][e],A[i][e]=0;
    		for(j=1;j<=p[0];j++)	A[i][p[j]]-=t*A[l][p[j]];
    	}
    }
    void simplex()
    {
    	while(1)
    	{
    		double mn=inf;
    		int i,l=0,e=0;
    		for(i=1;i<=n;i++)	if(A[0][i]>eps)
    		{
    			e=i;
    			break;
    		}
    		if(!e)	return;
    		for(i=1;i<=m;i++)	if(A[i][e]>eps&&A[i][0]/A[i][e]<mn)	mn=A[i][0]/A[i][e],l=i;
    		if(!l)	return;
    		pivot(l,e);
    	}
    }
    int main()
    {
    	m=rd(),n=rd();
    	int i,j,l,r;
    	for(i=1;i<=m;i++)	A[i][0]=rd();
    	for(i=1;i<=n;i++)
    	{
    		l=rd(),r=rd(),A[0][i]=rd();
    		for(j=l;j<=r;j++)	A[j][i]=1;
    	}
    	simplex();
    	printf("%d",int(-A[0][0]+0.5));
    	return 0;
    }
  • 相关阅读:
    Problem B. Harvest of Apples
    字典树的学习
    PACM Team
    2038: [2009国家集训队]小Z的袜子(hose)
    Naive Operations
    C程序设计语言练习 第三章
    数据结构C++实现-第一章 绪论
    排序
    操作系统设计与实现-第一章:序言
    进制转换
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7054184.html
Copyright © 2020-2023  润新知