zoukankan      html  css  js  c++  java
  • Atcoder Beginner Contest 080 C

    题目链接: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
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    冷水花
    石竹
    红花酢浆草
    紫鸭跖草
    吊竹梅
    花叶络石
    牡丹
    CF1190D Tokitsukaze and Strange Rectangle
    CF1178D Prime Graph
    CF958E2 Guard Duty (medium)
  • 原文地址:https://www.cnblogs.com/withhope/p/11129985.html
Copyright © 2011-2022 走看看