TYVJ 1982

送给WA的同学一组数据,废了我十金币。。。凸(艹皿艹 )垃圾tyvj

测试数据
输入
78 79 80
8287 5410 4901 63 8572 7924 7781 390 1663 9792 4857 2703 9269 4808 8800 6407 6123 2695 6037 184 5889 532 3249 1375 2435 986 7907 5522 1934 4692 9557 9679 3763 6632 1077 5564 674 8850 1620 1167 1193 4344 5476 1900 9736 9490 3545 4874 2386 4832 6670 2412 8823 6584 2524 3382 3358 3694 290 3441 550 7798 9830 7799 3376 5930 4592 2576 4409 8311 9937 3365 2993 6075 1141 2076 3863 6267 7764
5679 5195 3963 3619 2911 6553 3850 4053 7562 9681 6114 4761 9430 7647 3981 8856 6529 264 2745 1407 4655 6297 2642 3164 2900 5397 403 7695 6200 5236 6829 8648 8529 1829 236 6361 2810 3486 8120 5533 6158 1381 1870 8179 1533 2202 1882 8591 9401 846 2925 9515 5510 3636 2087 1267 3345 5019 4154 8013 2395 3226 1769 7919 5784 2848 201 6403 3398 4812 9090 4195 9073 6712 5987 4435 2952 8976 9049 5524
输出
6731760


有趣,这题实际就是简单的最小费用最大流。
代码见下:

/*
#0: Accepted (15ms, 8748KiB)
#1: Accepted (0ms, 8748KiB)
#2: Accepted (0ms, 8752KiB)
#3: Accepted (46ms, 8748KiB)
#4: Accepted (0ms, 8756KiB)
#5: Accepted (15ms, 8748KiB)
#6: Accepted (0ms, 8748KiB)
#7: Accepted (0ms, 8748KiB)
#8: Accepted (0ms, 8748KiB)
#9: Accepted (15ms, 8748KiB)
*/
#include <cstdio>
#include <memory.h>
using namespace std;
int pr[20001],d[20001],f[1001][1001],w[1001][1001],q[20001],qwq[20001],qaq[20001],ans,cn,qcn,n,a,b;
bool ff[20001];
bool spfa ()
{
    memset(pr,0,sizeof(pr));
    memset(d,120,sizeof(d));//一定要大,不然WA到90分
    memset(ff,0,sizeof(ff));
    int h=0,t=1;
    ff[1]=1;d[1]=0;q[1]=1;
    while(h<t){
        h++;
        for(int i=1;i<=cn;i++)
         if(f[q[h]][i]&&d[i]>d[q[h]]+w[q[h]][i]){
             d[i]=d[q[h]]+w[q[h]][i];
             pr[i]=q[h];
             if(!ff[i])q[++t]=i,ff[i]=1;
         }
         ff[q[h]]=0;
    }
    if(d[cn]>1000000000)return 0;
    ans+=d[cn];return 1;
}
int main ()
{
    scanf("%d%d%d",&n,&a,&b);
    cn=2;
    f[cn-1][cn]=n;
    for(int i=1;i<=a;i++)scanf("%d",&qaq[i]),f[2][++cn]=1;
    qcn=cn;
    for(int i=1;i<=b;i++)scanf("%d",&qwq[i]),f[++cn][qcn+b+1]=1;
    cn++;
    for(int i=1;i<=a;i++)
     for(int j=1;j<=b;j++)w[2+i][qcn+j]=(qaq[i]-qwq[j])*(qaq[i]-qwq[j]),w[qcn+j][2+i]=-w[2+i][qcn+j],f[2+i][qcn+j]=1;
    while(spfa ()){
        int k=cn;
        while(k!=1)f[pr[k]][k]-=1,f[k][pr[k]]+=1,k=pr[k];
    }
    printf("%d\n",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值