2019牛客暑期多校训练营(第六场)J(枚举)

比赛时用的是枚举,思路基本对了,但少考虑了一种情况,就一直WA。
首先用sum[i,j]记录第i中科技升到j即所能获得的利润,s[j]记录所有科技升到j级时所获得的利润。
接下来从0 ~ m枚举所有科技最小的等级为i时,能够获得的利润。详见代码。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
const ll inf=1e18;		//inf要设得大一点,有一次因为太小了而WA
const int maxn=1e3+5;
ll c[maxn][maxn],d[maxn];
ll sum[maxn][maxn],s[maxn];
 
int main()
{
    int T,kase=0;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i)
        {
            sum[i][0]=0;
            for(int j=1;j<=m;++j)
            {
                scanf("%lld",&c[i][j]);
                c[i][j]=-c[i][j];
                sum[i][j]=sum[i][j-1]+c[i][j];
            }
        }
        for(int i=1;i<=m;++i)
            scanf("%lld",&d[i]);
        s[0]=0;
        for(int j=1;j<=m;++j)
        {
            for(int i=1;i<=n;++i)
                d[j]+=c[i][j];
            s[j]=s[j-1]+d[j];
        }
        ll ans=0;
        for(int i=0;i<=m;++i)
        {
            ll temp=0,mi=inf,cnt=0;		//mi,cnt有用的,后面就会知道
            temp+=s[i];
            if(i!=m)
            {
            	for(int j=1;j<=n;++j)		//枚举每种科技能否继续升到[i+1,m]当中的某一级,从而使总利润增加
	            {
	            	ll ma=-inf;
	                for(int k=i+1;k<=m;++k)
	                	ma=max(ma,sum[j][k]-sum[j][i]);
	                if(ma>0)		//ma>0说明有戏
	                {
	                	++cnt;		//一个有戏,cnt就+1
	                	temp+=ma;
	                	mi=min(mi,ma);	//mi记录有戏的当中,能够使总利润增加最少的那一个
					}
	            }
	            if(cnt==n)	temp-=mi;	//比赛就是少考虑了这种情况,当所有科技都有戏时,当前最小的等级就不是i了,与假设相悖,要减去mi
			}
            ans=max(ans,temp);
        }
        printf("Case #%d: %lld\n",++kase,ans);
    }
    return 0;
 }

小结:3层循环暴力枚举也能AC,还是有点意想不到的,比赛时担心超时,一直想着怎么优化,还是想太多了,下次遇到枚举的题先暴力打一遍试水吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值