这题问题就是当前时刻究竟选择哪门课程,易知选择是和分数有关的,而且是一个变化的权值,所以能够用拆点的方式,把从基础分到100分都拆成点。但若这样拆点的话,跑费用流时就必须保证顺序。这样就麻烦了。。观察公式。发现同一门课,分数越高。权值是越低的,所以这是一个单调的。这种话就能够对每个分数建一条边。费用流会一条一条的跑。

注意将课程放在X集

  1. #include<cstdio>
  2. #include<queue>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. #define eps 1e-8
  7. #define MAXN 100
  8. #define MAXM 1000000
  9. #define INF 100000
  10. struct node
  11. {
  12. int u,v,f,next;
  13. double c;
  14. }e[MAXM];
  15. int n,k,head[MAXN],pre[MAXN],vis[MAXN];
  16. double dist[MAXN];
  17. int en,s,t,maxflow,mincost,m; //s源点,t汇点
  18. void add(int u,int v,double c,int f)//加边
  19. {
  20. e[en].u=u;
  21. e[en].v=v;
  22. e[en].c=c;
  23. e[en].f=f;
  24. e[en].next=head[u];
  25. head[u]=en++;
  26. e[en].u=v;
  27. e[en].v=u;
  28. e[en].c=-c;
  29. e[en].f=0;
  30. e[en].next=head[v];
  31. head[v]=en++;
  32. }
  33. int spfa()
  34. {
  35. int i,u,v;
  36. for(i=0;i<=t;i++)
  37. pre[i]=-1,vis[i]=0,dist[i]=-INF;
  38. dist[s]=0;
  39. vis[s]=1;
  40. queue<int>q;
  41. q.push(s);
  42. while(!q.empty())
  43. {
  44. u=q.front();
  45. q.pop();
  46. for(i=head[u];i!=-1;i=e[i].next)
  47. {
  48. v=e[i].v;
  49. if(e[i].f>0&&dist[u]+e[i].c-eps>dist[v])
  50. {
  51. dist[v]=dist[u]+e[i].c;
  52. pre[v]=i;
  53. if(!vis[v])
  54. {
  55. vis[v]=1;
  56. q.push(v);
  57. }
  58. }
  59. }
  60. vis[u]=0;
  61. }
  62. if(dist[t]==-INF)
  63. return 0;
  64. return 1;
  65. }
  66. void add()
  67. {
  68. int v;
  69. int maxf=INF;
  70. for(v=pre[t];~v;v=pre[e[v].u])
  71. maxf=min(maxf,e[v].f);
  72. for(v=pre[t];~v;v=pre[e[v].u])
  73. {
  74. e[v].f-=maxf;
  75. e[v^1].f+=maxf;
  76. mincost+=maxf*e[v].c;
  77. }
  78. maxflow+=maxf;
  79. }
  80. int a[123];
  81. int w[123];
  82. int ADD[123];
  83. int mp[123][123];
  84. void init()
  85. {
  86. maxflow=0;
  87. mincost=0;
  88. s=0;
  89. t=n+m+1;
  90. en=0;
  91. memset(head,-1,sizeof(head));
  92. memset(ADD,0,sizeof(ADD));
  93. }
  94. double cal(int x,int w)
  95. {
  96. return (4.0-3.0*(100.0-x)*(100.0-x)/1600.0)*w;
  97. }
  98. int main()
  99. {
  100. int k,b;
  101. while(~scanf("%d%d%d",&n,&k,&m))
  102. {
  103. if(n+k+m==0) break;
  104. init();
  105. for(int i=1;i<=m;i++) scanf("%d",&w[i]);
  106. for(int i=1;i<=m;i++) scanf("%d",&a[i]);
  107. for(int i=1;i<=m;i++)
  108. {
  109. for(int q=a[i];q<60;q++) add(s,i,INF,1);
  110. for(int q=max(a[i],60);q<100;q++) add(s,i,cal(q+1,w[i])-cal(q,w[i]),1);
  111. }
  112. for(int i=1;i<=n;i++)
  113. {
  114. add(m+i,t,0,k);
  115. for(int j=1;j<=m;j++)
  116. {
  117. scanf("%d",&b);
  118. if(b) add(j,m+i,0,INF);
  119. }
  120. }
  121. while(spfa()) add();
  122. for(int i=head[s];~i;i=e[i].next)
  123. {
  124. if(e[i].v>=1&&e[i].v<=m&&e[i].f==0) ADD[e[i].v]++;
  125. }
  126. int ok=1;
  127. for(int i=1;i<=m;i++)
  128. {
  129. if(a[i]+ADD[i]<60)
  130. {
  131. ok=0;
  132. break;
  133. }
  134. a[i]+=ADD[i];
  135. }
  136. if(ok==0)
  137. {
  138. puts("0.000000");
  139. }
  140. else
  141. {
  142. double ans=0;
  143. int d=0;
  144. for(int i=1;i<=m;i++)
  145. {
  146. ans+=cal(a[i],w[i]);
  147. d+=w[i];
  148. }
  149. printf("%.6lf\n",ans/d);
  150. }
  151. }
  152. return 0;
  153. }

hdu 4406 费用流的更多相关文章

  1. Going Home HDU - 1533 费用流

    http://acm.hdu.edu.cn/showproblem.php?pid=1533 给一个网格图,每两个点之间的匹配花费为其曼哈顿距离,问给每个的"$m$"匹配到一个&q ...

  2. hdu 5045 费用流

    滚动建图,最大费用流(每次仅仅有就10个点的二分图).复杂度,m/n*(n^2)(n<=10),今年网络赛唯一网络流题,被队友状压DP秒了....难道网络流要逐渐退出历史舞台???.... #i ...

  3. HDU 3376 费用流 Matrix Again

    题意: 给出一个n × n的矩阵,每个格子中有一个数字代表权值,找出从左上角出发到右下角的两条不相交的路径(起点和终点除外),使得两条路径权值之和最大. 分析: 如果n比较小的话是可以DP的,但是现在 ...

  4. hdu 2686 费用流 / 双线程DP

    题意:给一个方阵,求从左上角出到右下角(并返回到起点),经过每个点一次不重复,求最大获益(走到某处获得改点数值),下来时每次只能向右或向下,反之向上或向左. 俩种解法: 1  费用流法:思路转化:从左 ...

  5. hdu 1853 (费用流 拆点)

    // 给定一个有向图,必须用若干个环来覆盖整个图,要求这些覆盖的环的权值最小. 思路:原图每个点 u 拆为 u 和 u' ,从源点引容量为 1 费用为 0 的边到 u ,从 u' 引相同性质的边到汇点 ...

  6. HDU 3667 费用流 拆边 Transportation

    题意: 有N个城市,M条有向道路,要从1号城市运送K个货物到N号城市. 每条有向道路<u, v>运送费用和运送量的平方成正比,系数为ai 而且每条路最多运送Ci个货物,求最小费用. 分析: ...

  7. HDU 3667 费用流(拆边)

    题意:有n个城市(1~n),m条有向边:有k件货物要从1运到n,每条边最多能运c件货物,每条边有一个危险系数ai,经过这条路的费用需要ai*x2(x为货物的数量),问所有货物安全到达的费用. 思路:c ...

  8. HDU 5644 (费用流)

    Problem King's Pilots (HDU 5644) 题目大意 举办一次持续n天的飞行表演,第i天需要Pi个飞行员.共有m种休假计划,每个飞行员表演1次后,需要休假Si天,并提供Ti报酬来 ...

  9. HDU - 4780费用流

    题意:M台机器要生产n个糖果,糖果i的生产区间在(si, ti),花费是k(pi-si),pi是实际开始生产的时间机器,j从初始化到生产糖果i所需的时间Cij,花费是Dij,任意机器从生产糖果i到生产 ...

随机推荐

  1. kali之Nmap (Network Mapper(网络映射器)

    Nmap是主机扫描工具,他的图形化界面是Zenmap,分布式框架为Dnamp. Nmap可以完成以下任务: 主机探测 端口扫描 版本检测 系统检测 支持探测脚本的编写 Nmap在实际中应用场合如下: ...

  2. 【hdu 6038】Function

    [Link]:http://codeforces.com/contest/834/problem/C [Description] 给你两个排列a和b; a排列的长度为n,b排列的长度为m; a∈[0. ...

  3. Funui-Theme 资源的替换

    实现资源的替换,需要分为以下几个步骤 1.找到需要更改的模块 mediatek/packages/apps/FileManager 2.到主题模块下根据包名找到相应资源(以Grass为例) cd ve ...

  4. H5+混合移动app

    H5+混合移动app 前言 经过2个多月的艰苦奋斗,app的第一个版本已经快完工了,期间遇到了太多的坑,作为一个喜欢分享的人,我当然不会吝啬分享这爬坑历程.不要问我有多坑,我会告诉你很多,很多.... ...

  5. BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...

  6. WSDL生成dll

    --生成代理类wsdl /l:cs /n:OAWebService /out:D:OAWebService.cs D:\OAWebService.WSDL--生成dllcsc /out:D:OAWeb ...

  7. webservie授权调用

    Dim usercode As String = System.Configuration.ConfigurationSettings.AppSettings("SAPWebServiceU ...

  8. js引入广告服务

    var header = []; header[1] = { 'title' : '新浪开始进军微博大战', 'pic' : 'images/header1.png', 'link' : 'http: ...

  9. SUSE Linux Enterprise Server 11 64T 安装(带清晰视频)

    SUSE Linux Enterprise Server 11 64T 安装实录 650) this.width=650;" onclick='window.open("http: ...

  10. DG观察日志传输

    --primary端查询v$archived_log视图,确认日志是否被应用:   set lines 300 pages 300 col name for a20 select name,dest_ ...