TYVJ1982 武器分配

描述

后勤部队运来一批武器(机枪和盔甲)。你要把这些武器分配给手下的marine们(每人一部机枪,一套盔甲)。可是问题来了。。。
    这些武器的型号不相同(武器是由出价最低的承包商制造的),把一部m型的机枪和一套n型的盔甲分配给一个marine得到的不满意值为(m-n)^2(每个marine当然希望自己得到的武器是同一型号的)。
    你的任务就是把a部机枪和b套盔甲分配给手下n个marine。使他们的不满意值之和最小。

输入格式

第一行:3 个正整数 n , a , b (1<=n<=a,b<=80)
第二行:a 个数表示每部机枪的型号
第三行:b 个数表示每套盔甲的型号
0<=型号值<=10000

输出格式

输出一个数:最小不满意值。

测试样例1

输入

Sample 1:
2 3 3
9 10 20
0 10 11
Sample 2:
3 4 4
3 9 7 4
4 2 5 5

输出

Sample 1:
2
Sample 2:
5

费用流。

有最大流量限制,那么就在汇点T后面加个T2,从T到T2连边,容量为n(最大人数)。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<queue>
 6 #include<cstring>
 7 using namespace std;
 8 const int INF=1e8;
 9 const int mxn=9000;
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
13     while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
14     return x*f;
15 }
16 struct edge{
17     int from,v,nxt;
18     int f,w;
19 }e[mxn<<1];
20 int hd[mxn],mct=1;//
21 inline void add_edge(int u,int v,int c,int w){
22     e[++mct].v=v;e[mct].from=u;e[mct].nxt=hd[u];e[mct].f=c;e[mct].w=w;hd[u]=mct;return;
23 }
24 void insert(int u,int v,int c,int w){
25     add_edge(u,v,c,w);
26     add_edge(v,u,0,-w);
27     return;
28 }
29 //
30 int n,m;
31 int S,T,T2;
32 int ans=0;
33 //
34 int dis[mxn];
35 bool inq[mxn];
36 int pre[mxn<<1];
37 void SPFA(int s){
38     memset(dis,0x3f,sizeof dis);
39     memset(pre,-1,sizeof pre);
40     queue<int>q;
41     dis[s]=0;
42     inq[s]=1;
43     q.push(s);
44     while(!q.empty()){
45         int u=q.front();q.pop();inq[u]=0;
46         for(int i=hd[u];i;i=e[i].nxt){
47             if(!e[i].f)continue;
48             int v=e[i].v;
49             if(dis[v]>dis[u]+e[i].w){
50                 dis[v]=dis[u]+e[i].w;
51                 pre[v]=i;//记录前驱边
52                 if(!inq[v]){
53                     inq[v]=1;
54                     q.push(v);
55                 }
56             }
57         }
58     }
59     return;
60 }
61 void maxflow(int s,int t){
62     SPFA(s);
63     while(pre[t]!=-1){
64         int tmp=INF;
65         for(int i=pre[t];i!=-1;i=pre[e[i].from])
66             tmp=min(tmp,e[i].f);
67         ans+=dis[t]*tmp;
68         for(int i=pre[t];i!=-1;i=pre[e[i].from]){
69             e[i].f-=tmp;
70             e[i^1].f+=tmp;
71         }
72         SPFA(s);
73     }
74     return;
75 }
76 int a,b;
77 int ac[120],bc[120];
78 int main()
79 {
80     int i,j,u,v;
81     n=read();a=read();b=read();
82     for(i=1;i<=a;i++){ac[i]=read();}
83     for(i=1;i<=b;i++){bc[i]=read();}
84     S=0;T=a+b+1;T2=T+1;
85     for(i=1;i<=a;i++)
86         for(j=1;j<=b;j++){
87             insert(i,a+j,1,(ac[i]-bc[j])*(ac[i]-bc[j]));
88         }
89     for(i=1;i<=a;i++)insert(S,i,1,0);
90     for(i=1;i<=b;i++)insert(a+i,T,1,0);
91     insert(T,T2,n,0);//限制匹配人数
92     maxflow(S,T2);
93     printf("%d\n",ans);
94     return 0;
95 }
时间: 2024-10-29 19:09:59

TYVJ1982 武器分配的相关文章

【TYVJ】1982 武器分配(费用流)

http://tyvj.cn/Problem_Show.aspx?id=1982 一眼题.. 源向每个人连容量为1,费用为0的边. 每个人向一个中转节点na连容量1,费用0的边(你也可以不连,直接连后边的) 中转节点na想所有a物品连容量1,费用0的边 所有a物品向所有b物品连容量1,费用为(m-n)^2的边 所有b物品向汇连容量1,费用0的边. 跑一次费用流即可. #include <cstdio> #include <cstring> #include <cmath>

【Tyvj1982】武器分配(费用流)

题意:有N个人要从A个物品中各取一个,B个物品中各取一个,选取第i个A类物品和第j个B类物品的费用是(a[i]-b[j])^2 求最小总花费 n<=a,b<=80 a[i],b[i]<=10000 思路:第一题费用流 由源点到每个A类物品连容量为1,费用为0的边 每个B类物品到第一个汇点连容量为1,费用为0的边 对于ai和bj连容量为1,费用为(a[i]-b[j])^2的边 因为只需要N对物品,由第一个汇点到第二个汇点连容量为N,费用为0的边来限制流量上限 答案就是从源点到第二个汇点流量

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

7、8月刷题总结

准备开学了囧,7.8月刷题记录,以后好来复习,并且还要好好总结! 数据结构: splay: [BZOJ]1503: [NOI2004]郁闷的出纳员(Splay) [BZOJ]1269: [AHOI2006]文本编辑器editor(Splay) [BZOJ]1507: [NOI2003]Editor(Splay) treap: [BZOJ]1862: [Zjoi2006]GameZ游戏排名系统 & 1056: [HAOI2008]排名系统(treap+非常小心) [BZOJ]3224: Tyvj

(转载)虚幻引擎3--12掌握虚幻技术UnrealScript 代理

第十二章- DELEGATES(代理) 12.1 –概述 12.2 - 声明代理(Delegate) 代理参数 默认行为 12.3 - 代理变量 12.4 - 传递Delegate(代理)给函数 12.5 - 代理和内存 12.6 -       UISCENE 和 UIOBJECT       DELEGATES(代理) UISCENE 代理 UIOBJECT 的代理 12.7 – 虚幻引擎3和虚幻竞技场3中的其它代理 AUDIOCOMPONENT GAMEINFO GAMEVIEWPORTC

[转载]项目风险管理七种武器-拳头

在和QA梳理质量风险的应对方案时,小帅发现要执行好这个质量标准,QA存在人力风险,而RD又缺少相应的经验.小帅习惯性的挠了挠头,突然想起来度教授曾经说过的一句话:“再完美的计划,再严格的质量标准,都需要有激情负责任的人去落地,所以一定要用好最后一个武器!” “愤怒的小马”这一辈子做的事,都是他自己愿意做的,喜欢做的. 关键词 激情. 进攻时刻,不胜不归! 演绎 激情. 如何管理项目中人员风险 几乎所有项目中都发生了人力不足的风险,尤其是方向探索类的项目,产品经理期望通过并行多个业务创意,以期尽早

MySQL加速查询速度的独门武器:查询缓存

[导读] 与朋友或同事谈到MySQL查询缓存功能的时候,个人喜欢把查询缓存功能Query Cache比作荔枝, 是非常营养的东西,但是一次性吃太多了,就容易上火而流鼻血,虽然不是特别恰当的比喻,但是有很多相似的地方.另外Query Cache有其特殊的业务场景,MySQL也不像其他数据库产品,缓存查询语句的执行计划等信息,而是直接缓存查询语句的结果集和对应的SQL语句.本文 就给大家介绍下查询缓存的相关知识,希望可以引导大家正确地使用Query Cache独门武器. 对MySQL查询缓存从五个角

FPGA成神之路 ----- 菜鸟的武器(edk 开发使用)

给大家介绍菜鸟的第二款武器.xilinx edk 开发软件. 武器介绍: 名称:Xilinx Platform Studio 功能:xilinx 系列FPGA利用MicroBlaze或硬核开发的必备武器,属于ise套装中的一部分.此武器很少单独出现,一般都是和他的爱妻SDK一同闯荡江湖. 武力:4星.(与sdk合体后,武力值翻倍) 推荐等级: 9级(学习MicroBlaze开发的菜鸟必备) 备注:本版本开发套件,为xilinx公司ise产品最后一个版本.优点多多,BUG也多多,这里的BUG在ED

【c/c++】内存分配大小

测试平台:linux 32位系统 用sizeof()运算符计算分配空间大小.单位:字节 1. 数组名与变量名的区别 int main() { char q[] = "hello"; cout << "q:" << sizeof(q) << endl; char *mq = q; cout << "mq:" << sizeof(mq) << endl; const char *