zoukankan      html  css  js  c++  java
  • J.Spy

    Over time, those coaches in BDN Collegiate Progranuning Contest split into two camps.The big danger is that, while optimists and pessimists battle it out, the environment of this area becomes ever more divided between universities with outstanding student resources surrounded by a vast neglected group of stagnation.

    Amy and Bob, as the linchpins of these two camps respectively, decided to put the end to the rival. Now both camps hold nn coders and nn tea-bringers as the last resource on hand. They will form teams in pair that each team should consist of a coder and a tea-bringer. The power of a team is regarded as the sum of powers of both members.

    Now Bob hired a spy and has got some information about the plan of his rival: the power of each team which will present for the enemy camp, and the corresponding unit of reputations that Bob would gain after beating this team. Naturally, he hopes to make the best arrangement of teams in his camp for more reputations.

    These two camps will have a collision soon, and their teams will fight one on one in random order. That is, we may have n!n! different situations appearing in this collision. A team would triumphantly return if it has a higher power. When two teams of the same power meet, the one led by Amy would beat the rival by a neck.

    Can you calculate the maximum expected unit of reputations that Bob will gain? To make the answer be an integer, you are asked to multiply the answer by nn and we guarantee that the expected number multiplied by nn should always be an integer.

    在这里插入图片描述
    在这里插入图片描述
    KM算法模板 bfs优化时间复杂度真正的O^3

    
    #include <iostream>
    #include<stdio.h>
    #include<cstdio>
    #include<algorithm>
    #include<vector>
    #include<cstring>
    #define ll long long
    using namespace std;
    #define maxn 605
    #define INF 0x3f3f3f3f
    ll n, a[maxn],b[maxn],c[maxn],p[maxn];
    ll w[maxn][maxn];
    ll lx[maxn] , ly[maxn];
    ll linker[maxn];
    ll slack[maxn];
    bool visy[maxn];
    ll pre[maxn];
    void bfs( ll k ){
        ll x , y = 0 , yy = 0 , delta;
        memset( pre , 0 , sizeof(pre) );
        for( ll i = 1 ; i <= n ; i++ ) slack[i] = INF;
        linker[y] = k;
        while(1){
            x = linker[y]; delta = INF; visy[y] = true;
            for( ll i = 1 ; i <= n ;i++ ){
                if( !visy[i] ){
                    if( slack[i] > lx[x] + ly[i] - w[x][i] ){
                        slack[i] = lx[x] + ly[i] - w[x][i];
                        pre[i] = y;
                    }
                    if( slack[i] < delta ) delta = slack[i] , yy = i ;
                }
            }
            for( ll i = 0 ; i <= n ; i++ ){
                if( visy[i] ) lx[linker[i]] -= delta , ly[i] += delta;
                else slack[i] -= delta;
            }
            y = yy ;
            if( linker[y] == -1 ) break;
        }
        while( y ) linker[y] = linker[pre[y]] , y = pre[y];
    }
     
    ll KM(){
        memset( lx , 0 ,sizeof(lx) );
        memset( ly , 0 ,sizeof(ly) );
        memset( linker , -1, sizeof(linker) );
        for( ll i = 1 ; i <= n ; i++ ){
            memset( visy , false , sizeof(visy) );
            bfs(i);
        }
        ll res = 0 ;
            for( ll i = 1 ; i <= n ; i++ ){
                if( linker[i] != -1 ){
                    res += w[linker[i]][i] ;
                }
            }
            return res;
    }
     
    int main()
    {
        scanf("%lld",&n);
        for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
        for(ll i=1;i<=n;i++) scanf("%lld",&p[i]);
        for(ll i=1;i<=n;i++) scanf("%lld",&b[i]);
        for(ll i=1;i<=n;i++) scanf("%lld",&c[i]);
        for(ll i=1;i<=n;i++)
        {
            for(ll j=1;j<=n;j++)
            {
                ll s=0;
                for(ll k=1;k<=n;k++)
                {
                    if(b[i]+c[j]>a[k]) s+=p[k];
                }
                w[i][j]=s;
            }
        }
        printf("%lld
    ",KM());
    }
    
    每次做题提醒自己:题目到底有没有读懂,有没有分析彻底、算法够不够贪心、暴力够不够优雅。
  • 相关阅读:
    margin和pading的百分比值
    Vue中的computed和watch
    JS的自身属性和继承属性
    JS对象的可枚举属性和不可枚举属性
    Dart语言学习
    Practice_Test
    Lesson2 basic python_20200920
    Python 基础语法L1
    小男孩和狗的故事
    智者的故事
  • 原文地址:https://www.cnblogs.com/spnooyseed/p/12870869.html
Copyright © 2011-2022 走看看