线性规划

BZOJ3550

#include <cstdio>
#include <cmath>
#define LDB long double
using namespace std;

  int ycnt,xcnt,lowb,n,k;
  LDB ans[3001];
  LDB lim[2001][3001];

  const LDB eps=1e-6;

  int find(){
      int maxi=-1e9,po=0;
      for (int i=1;i<=ycnt;i++)
        if (ans[i]>maxi){
          maxi=ans[i],po=i;
      }
    if (maxi<eps) return(0);
    int tar=po;
    maxi=1e9,po=0;
    for (int i=1;i<=xcnt;i++)
      if ((lim[i][tar])>eps&&lim[i][0]/lim[i][tar]<maxi){
          maxi=lim[i][0]/lim[i][tar];po=i;
      }  

    for (int i=0;i<=ycnt;i++){
      LDB t=lim[lowb][i];lim[lowb][i]=lim[po][i];lim[po][i]=t;
    }
    return(tar);
  }

  void work(){
      while (int po=find()){
        for (int i=1;i<=xcnt;i++) if (lim[i][po]&&i!=lowb){
          LDB bas=lim[i][po]/lim[lowb][po];
        for (int j=0;j<=ycnt;j++) lim[i][j]-=bas*lim[lowb][j];
      }
        LDB bas=ans[po]/lim[lowb][po];
      for (int j=0;j<=ycnt;j++) ans[j]-=bas*lim[lowb][j];
      lowb++;
    }
  }

  int main(){
    scanf("%d%d",&n,&k);
    ycnt=3*n;
    for (int i=1;i<=2*n+1;i++){
      xcnt++;ycnt++;
      lim[xcnt][0]=k;
      lim[xcnt][ycnt]=1;
      for (int j=i;j<=i+n-1;j++) lim[xcnt][j]=1;
    }
    for (int i=1;i<=3*n;i++){
      xcnt++;ycnt++;
      lim[xcnt][ycnt]=1;
      lim[xcnt][0]=1;
      lim[xcnt][i]=1;
    }

    for (int i=1;i<=3*n;i++) scanf("%Lf",&ans[i]);
    work();

     printf("%d\n",(int)(-ans[0]+0.5));
  }
时间: 2024-08-06 09:05:12

线性规划的相关文章

线性规划初探

看完<算法导论>肯定会写单纯形 因为单纯形不仅好写而且<算法导论>里讲的很清楚 附赠uoj179的模板一个 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<stdlib.h> 7 8 using namespace std; 9 const

数学(线性规划): 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-

【网络流】线性规划的最小割建模方式

前几天在师大附中听课,大概了解了一些关于网络流的建模方式,然后今天上午做了一些题目,在这里总结一下. 最小割的线性规划建模方式: 有一些0/1变量Xi,怎么怎么样之后会消耗某些代价或者获得某些利益,而最后的总收益可以写成如下的形式: min{ Σmax{Xi-Xj,0}*Wi } 其中Wi必须是正数. 那么假设源为1,汇为0,就将Xi连一条流量为Wi的边到Xj. 如果有形如1-Xi之类的形式就是从源向Xi连边,Xi-0这种形式就是Xi向汇点连边. 那么如果Wi是负数怎么办? 比如Xi*Wi(Wi

线性规划问题中的差分约束与最短路径

先给一个线性规划的定义: 在通用的线性规划问题中,我们通常给定一个m*n的矩阵A,一个m维的向量和一个n维向量(权值函数).我们希望找到一个n维向量x,使得在由Ax<=b给定的m个约束条件下优化目标函数ci*xi,这里的优化是指目标函数的取值最大. 根据矩阵乘法,我们大概脑补出这样一幅图 ps:上图中<号应为<=号(我会告诉你是我懒得改 ) 通过化简我们得到 x1-x3<=b1;x3<=b2;x2-x3<=b3; 这跟我们的最短路径有什么关系呢? 在最短路径的三角不等式

UOJ#179. 线性规划[模板]

传送门 http://uoj.ac/problem/179 震惊,博主竟然还不会线性规划! 单纯形实在学不会啊……背个板子当黑盒用…… 学(chao)了NanoApe dalao的板子 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 const d

matlab绘图--线性规划图解法示意

matlab绘图--线性规划图解法示意 图解法 matlab绘图 区域填充 线性规划问题: matlab绘图 L1=[4,0;4,4]; plot(L1(:,1),L1(:,2));hold on  text(4.1,3.5,'x_1=4','color','b');  L2=[0 3;5 3];  plot(L2(:,1),L2(:,2));hold on  text(0.8,3.1,'x_2=3','color','b');  L3=[0 2.4;5 0.4];  plot(L3(:,1),

线性规划(Simplex单纯形)与对偶问题

线性规划 首先一般所有的线性规划问题我们都可以转换成如下标准型: 但是我们可以发现上面都是不等式,而我们计算中更希望是等式,所以我们引入这个新的概念:松弛型: 很显然我们最后要求是所有的约束左边的变量都不小于0.而求解这类问题,我们又有一套十分便利的模型算法:单纯形 基变量:松弛型等式左边的所有变量 非基变量:松弛型等式右侧的所有变量 基本解:一组基变量和非基变量蕴含着一组基本解,即所有的非基变量都为0,基变量都为等式右侧的常数项(这里要求常数项为正,为负时我们后面讨论) 算法原理: 可证线性规

数学(线性规划):UVAoj 10498 Happiness

Problem GHappiness! Input: standard inputOutput: standard outputTime Limit: 3 seconds Prof. Kaykobad has given Nasa the duty of buying some food for the ACM contestents. Nasa decided to buy n different items. He then asked each of the m contestents h

线性规划 单纯形

求解线性规划最优解问题(全部转化成约束条件<=(非负条件可以是>=),并且求最大值问题) bzoj1061 志愿者招募 题目大意:给定n天,每天需要志愿者ai人:m类志愿者,从si-ti天工作,每人要ci元.求最小费用. 思路:根据题意可以列出目标函数是min sigma(i=1~m)cixi,约束条件是 sigma(i=1~m)Aijxi>=aj(j=1~n)(Aij表示这一天志愿者能否工作),xi>=0.这个问题如果*-1转化的话,可能要求解辅助约束.所以可以用对偶问题来解决,

吃货如何理解线性规划的对偶

1. 啥是对偶 对偶(duality)本身是一种非常普遍的概念,在生活中非常常见.比如你在吃一个甜筒冰激凌,为了能吃出一个洞来,你先从上面吃,然后再从下面吃,最后终于被你吃出了一个洞!当然这是玩笑了,下面是一个严肃的例子.比如爬山的时候一个大台阶你先上去了,回头拉你的女朋友上来,这时候就出现了一个标准的对偶:你把手尽力往下伸(最小化),而她把手尽力往上伸(最大化),最后终于碰到一起了(强对偶定理).这个过程中,你的手的高度总是高于或等于女朋友的手(弱对偶定理).线性规划中对偶的格式非常固定,但是