Atcoder Beginner Contest 080 C - Shopping Street 题解

题目链接:C - Shopping Street
题意:在一条街上,Joisino想开一家店铺,一周有5个工作日,每个工作日分上午和下午(Joisino只开这五天)。\(F_{i,j,k}\)为第\(i\)个超市在第\(j\)天的第\(k\)个时段(\(k=0\)为上午,\(k=1\)为下午)是否开放,若为\(1\),则开放,否则不开放。Joisino清楚自己的收益与开放的店铺数有关,令\(c_i\)表示开放的店铺数,那么Joisino的收益便是\(P_{i,{c_i}}\),总收益便是这些P值的和。求如何让总收益最大。
题解:由于数据范围十分小,只有\(10\),所以很自然地就会想到\(2^{10}\)的二进制枚举,最后在中间取一个最大值即可。
下面是代码:

#include <cstdio>
#include <cstring>
#define Maxn 100000
#define Inf 0x3f3f3f3f
int f[Maxn+5][15];
int p[Maxn+5][15];
int tmp[Maxn+5];
int mx(int a,int b){
    return a>b?a:b;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=10;j++){
            scanf("%d",&f[i][j]);
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<=10;j++){
            scanf("%d",&p[i][j]);
        }
    }
    int ans=-Inf;
    int now;
    for(int i=1;i<(1<<10);i++){
        memset(tmp,0,sizeof tmp);
        for(int j=1;j<=n;j++){
            for(int k=1;k<=10;k++){
                if(f[j][k]&&((1<<(k-1))&i)){
                    tmp[j]++;
                }
            }
        }
        now=0;
        for(int j=1;j<=n;j++){
            now+=p[j][tmp[j]];
        }
        ans=mx(ans,now);
    }
    printf("%d\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/withhope/p/11129985.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值