[tyvj1982]武器分配

Description

后勤部队运来一批武器(机枪和盔甲)。你要把这些武器分配给手下的marine们(每人一部机枪,一套盔甲)。

可是问题来了。。。这些武器的型号不相同(武器是由出价最低的承包商制造的),把一部m型的机枪和一套n型的盔甲分配给一个marine得到的不满意值为(m-n)^2(每个marine当然希望自己得到的武器是同一型号的)。

你的任务就是把a部机枪和b套盔甲分配给手下n个marine。使他们的不满意值之和最小。

Input

第一行:3 个正整数 n , a , b (1<=n<=a,b<=80)

第二行:a 个数表示每部机枪的型号

第三行:b 个数表示每套盔甲的型号

0<=型号值<=10000

Output

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

Solution:

本题用费用流来写。

建模:首先,把每一个人与源点连起来 S -> person 容量:1 费用:0

把每一把枪都和所有的盔甲连起来,容量为1,费用为选择这两种的不满度

然后,再把每一件盔甲都与汇点相连,容量为1,费用为0

由于每一把枪和每一件盔甲都只能用一次,我们建立一个中转站tmp

把每个人和tmp相连,再把tmp和每一把枪相连,容量为1,费用为0

最后跑一遍费用流就行了

Code:

#include<bits/stdc++.h>
#define N 50001
#define inf 1926081700
using namespace std;
int n,a,b,cnt=1,tmp;
int S,T,head[N],gun[81];
struct Edge{int nxt,to,v,w;}edge[N];
void ins(int x,int y,int z,int w){
    edge[++cnt].nxt=head[x];
    edge[cnt].to=y;edge[cnt].v=z;
    edge[cnt].w=w;head[x]=cnt;
}
namespace Network_Flow{
    queue<int> q;
    int delta,maxflow,mincost;
    int vis[N],pre[N],dis[N];
    int spfa(){
        delta=inf;pre[T]=0;
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=tmp;i++) dis[i]=inf;
        q.push(S);vis[S]=1;dis[S]=0;
        while(!q.empty()){
            int x=q.front();q.pop();vis[x]=0;
            for(int i=head[x];i;i=edge[i].nxt){
                int y=edge[i].to;
                if(edge[i].v&&dis[x]+edge[i].w<dis[y]){
                    dis[y]=edge[i].w+dis[x];
                    delta=min(delta,edge[i].v);
                    pre[y]=i;if(!vis[y]) q.push(y),vis[y]=1;
                }
            }
        }
        return pre[T];
    }
    void update(){
        int x=T;
        while(x!=S){
            int u=pre[x];
            edge[u].v-=delta;
            edge[u^1].v+=delta;
            x=edge[u^1].to;
        }
        maxflow+=delta;mincost+=dis[T];
    }
    void Edmonds_Karp(){
        while(spfa()) update();
        printf("%d\n",mincost);
    }
}
int read(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
int main(){
    n=read(),a=read(),b=read();
    S=n+a+b+1,T=S+1,tmp=T+1;
    using namespace Network_Flow;
    for(int i=1;i<=n;i++)
        ins(S,i,1,0),ins(i,S,0,0);
    for(int i=1;i<=n;i++)
        ins(i,tmp,1,0),ins(tmp,i,0,0);
    for(int i=1;i<=a;i++){
        gun[i]=read();
        ins(tmp,i+n,1,0);
        ins(i+n,tmp,0,0);
    }
    for(int i=1;i<=b;i++){
        int x=read();
        for(int j=1;j<=a;j++){
            int y=x-gun[j];y*=y;
            ins(j+n,i+a+n,1,y);
            ins(i+a+n,j+n,0,-y);
        }
        ins(i+a+n,T,1,0);
        ins(T,i+a+n,0,0);
    }
    Edmonds_Karp();
    return 0;
}

转载于:https://www.cnblogs.com/NLDQY/p/10342780.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园2.0是高校信息化建设的新阶段,它面对着外部环境变化和内生动力的双重影响。国家战略要求和信息技术的快速发展,如云计算、大数据、物联网等,为智慧校园建设提供了机遇,同时也带来了挑战。智慧校园2.0强调以服务至上的办学理念,推动了教育模式的创新,并对传统人才培养模式产生了重大影响。 智慧校园建设的解决之道是构建一个开放、共享的信息化生态系统,利用互联网思维,打造柔性灵活的基础设施和强大的基础服务能力。这种生态系统支持快速迭代的开发和持续运营交付能力,同时注重用户体验,推动服务创新和管理变革。智慧校园的核心思想是“大平台+微应用+开放生态”,通过解耦、重构和统一运维监控,实现服务复用和深度融合,促进业务的快速迭代和自我演化。 智慧校园的总体框架包括多端协同,即“端”,它强调以人为中心,全面感知和捕获行为数据。这涉及到智能感知设备、超级APP、校园融合门户等,实现一“码”或“脸”通行,提供线上线下服务端的无缝连接。此外,中台战略是智慧校园建设的关键,包括业务中台和数据中台,它们支持教育资源域、教学服务域等多个领域,实现业务的深度融合和数据的全面治理。 在技术层面,智慧校园的建设需要分期进行,逐步解耦应用,优先发展轻量级应用,并逐步覆盖更多业务场景。技术升级路径包括业务数据化、数据业务化、校园设施智联化等,利用IoT/5G等技术实现设备的泛在互联,并通过人工智能与物联网技术的结合,建设智联网。这将有助于实现线上线下一网通办,提升校园安全和学习生活体验,同时支持人才培养改革和后勤管理的精细化。 智慧校园的建设不仅仅是技术的升级,更是对教育模式和管理方式的全面革新。通过构建开放、共享的信息化生态系统,智慧校园能够更好地适应快速变化的教育需求,提供更加个性化和高效的服务,推动教育创新和人才培养的高质量发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值