2016 青岛区域赛补题 B(模拟), G(费用流)

B: 就模拟下。
感觉自己不太熟悉这种代码。

#include<bits/stdc++.h>
using namespace std;
#define N 35
int b[N],a[N];
//int r[6][8]{
    //1,2,22,24,12,11,19,17,
    //3,4,21,23,10,9,19,17,
    //2,4,16,14,12,10,8,6,
    //1,3,5,7,9,11,13,15,
    //5,6,21,22,14,13,17,18,
    //7,8,23,24,14,13,19,20,
//};
int r[6][8]={
        16,17,0,1,20,21,11,10,
        18,19,2,3,22,23,9,8,
        0,2,4,6,8,10,12,14,
        1,3,5,7,9,11,13,15,
        4,5,22,20,15,14,17,19,
        6,7,23,21,13,12,16,18
    };
bool ok(){
    for(int i=0;i<6;++i){
        int t=b[i*4];
        for(int j=1;j<4;++j){
            if(b[i*4+j]!=t)return 0;
        }
    }
    return 1;
}
bool solve(){
    if(ok())return 1;
    for(int i=0;i<6;++i){
        for(int j=0;j<24;++j)b[j]=a[j];
        for(int j=0;j<8;++j){
            b[r[i][j]]=a[r[i][(j+2)%8]];
        }
        if(ok())return 1;
    }
    for(int i=0;i<6;++i){
        for(int j=0;j<24;++j)b[j]=a[j];
        for(int j=0;j<8;++j){
            b[r[i][j]]=a[r[i][(j-2+8)%8]];
        }
        if(ok())return 1;
    }
    return 0;
}
int main(){
    int T;scanf("%d",&T);
    //for(int i=0;i<6;++i){
        //for(int j=0;j<8;++j){
            //r[i][j]--;
        //}
    //}
    while(T--){
        for(int i=0;i<24;++i){
            scanf("%d",&a[i]);
            b[i]=a[i];
        }
        if(solve())puts("YES");
        else puts("NO");
    }
}

G:
这个去了对数之后的正负号转不过来。。。
参考:http://blog.csdn.net/xlzhang223/article/details/53260587


int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        init(n+50);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&a[i],&b[i]);
            c[i]=a[i]-b[i];
        }
        int u,v,f;
        double p;
        for(int i=0;i<m;i++){
            scanf("%d%d%d%lf",&u,&v,&f,&p);
            p=-log2(1.0-p);
            if(f>0) addedge(u,v,1,0.0);
            if(f-1>0) addedge(u,v,f-1,p);
        }
        for(int i=1;i<=n;i++){
            if(c[i]>0) addedge(0,i,c[i],0);
            else if(c[i]<0) addedge(i,n+1,-c[i],0);
        }
        double ans=0;
        minCostMaxflow(0,n+1,ans);
        ans=pow(2,-ans);
        printf("%.2f\n",1.0-ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值