2017.07.20

https://vjudge.net/contest/172194#problem/I

这题很绝望。。。一直做不出来。。
看了别人的代码后发现自己好傻逼。。

https://vjudge.net/contest/172194#problem/B
虽然知道是贪心,但是不知道为什么总是没写对。。
看来我的代码不够优雅。。。
看了大佬的,,真好。 而且更多的思考。就是不用判断是
lower_bound(+1) 因为如果最小的很不是最大的都可以》s了
那么最大的一定是运一次 。。

**
    int l=0,r=n+1;//看别人,这种写法比较优雅?
    int tol=0,cnt=0;
    while(l+1!=r){
        if(l+2==r){
            ans[++cnt]=a[l+1];
            tol++;
            break;
        }
        if(a[l+1]+a[r-1]>k){
            ans[++cnt]=a[++l];
            ans[++cnt]=a[--r];
            tol+=2;
        }else{
            ans[++cnt]=a[++l];
            ans[++cnt]=a[++l];
            tol++;
        }
    }**

https://vjudge.net/contest/172313#problem/A

km算法的模板题,不过还是要看别人的算法实现。。


int w[maxn][maxn];
int x[maxn],y[maxn],S[maxn],T[maxn];
int pre[maxn];
int slack;
int n;
bool find(int id){
    S[id]=true;
    for(int i=1;i<=n;++i){
        if(x[id]+y[i]==w[id][i]&&!T[i]){
            T[i]=true;
            if(pre[i]==-1||find(pre[i])){
                pre[i]=id;
                return true;
            }
        }else if(x[id]+y[i]>w[id][i]){
            slack=min(slack,x[id]+y[i]-w[id][i]);
        }
    }
    return false;
}
void update(){
    for(int i=1;i<=n;++i){
        if(S[i])x[i]-=slack;
        if(T[i])y[i]+=slack;
    }
}
void km(){
    for(int i=1;i<=n;++i){
        x[i]=y[i]=0;pre[i]=-1;
        for(int j=1;j<=n;++j){
            x[i]=max(x[i],w[i][j]);
        }
    }
    for(int i=1;i<=n;++i){
        while(1){
            for(int j=1;j<=n;++j)S[j]=T[j]=false;
            slack=INF;
            if(find(i))break;
            else update();
        }
    }
    int ans=0;
    for(int i=1;i<=n;++i){
        ans+=x[i]+y[i];
    }
    pf("%d\n",ans);
}

https://vjudge.net/contest/171669#problem/F
这题还是看了键哥给我的题解才知道的。。。
这里存约数
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值