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

news/2024/5/18 23:03:32 标签: 暴力, 枚举

比赛时用的是枚举,思路基本对了,但少考虑了一种情况,就一直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,还是有点意想不到的,比赛时担心超时,一直想着怎么优化,还是想太多了,下次遇到枚举的题先暴力打一遍试水吧。


http://www.niftyadmin.cn/n/943008.html

相关文章

bzoj 3524: [Poi2014]Couriers

Description 给一个长度为n的序列a。1≤a[i]≤n。 m组询问&#xff0c;每次询问一个区间[l,r]&#xff0c;是否存在一个数在[l,r]中出现的次数大于(r-l1)/2。如果存在&#xff0c;输出这个数&#xff0c;否则输出0。 Input 第一行两个数n&#xff0c;m。 第二行n个数&#xff0…

HDU3709,Balanced Number(数位DP)

题意&#xff1a;一个数是balanced number当且仅当它跟4139&#xff08;位置编号3210&#xff09;一样&#xff0c;当我们将pivot&#xff08;不知是啥&#xff09;的位置取在3的位置1时&#xff0c;左边4,1到3的距离和为4 * 2 1 * 1 9&#xff0c;右边9到3的距离9 * 1 9&am…

bzoj 2453: 维护队列

Description 你小时候玩过弹珠吗&#xff1f;小朋友A有一些弹珠&#xff0c;A喜欢把它们排成队列&#xff0c;从左到右编号为1到N。为了整个队列鲜艳美观&#xff0c;小朋友想知道某一段连续弹珠中&#xff0c;不同颜色的弹珠有多少。当然&#xff0c;A有时候会依据个人喜好&am…

data_frozen角色磁盘空间不够

解决办法 vim ./config/elasticsearch.yml add xpack.searchable.snapshot.shared_cache.size: 50% 以下几个设置不起作用: <!-- 当磁盘使用量低于 cluster.routing.allocation.disk.watermark.low 的阈值时&#xff0c;Elasticsearch 将会解除对分片分配的限制&#xf…

HDU2094,产生冠军

这道题关键是理解好题意吧。。。WA了很多次后&#xff0c;看了讨论区才知道题要求的是什么。其实题意是要你判断在赢的一方中&#xff0c;存在一个人不在输的一方&#xff0c;当这样的人不存在或者有多个时就不能产生冠军。 我觉得这题就是很蜜汁的题&#xff0c;题意没讲清&am…

bzoj 1907: 树的路径覆盖

Description Input Output Sample Input 1 7 1 2 2 3 2 4 4 6 5 6 6 7Sample Output 3HINT Source Play with Tree By Amber 自己写了一发贪心WA了。。然后去看题解 f[i]表示i为子树的最小路径覆盖就可以搞定了 或者 http://ydcydcy1.blog.163.com/blog/static/216089040201323…

2019牛客暑期多校训练营(第七场)A(暴力)

参考博客&#xff1a;https://www.cnblogs.com/JHSeng/p/11322901.html #include<queue> #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<vector> using namespace std; c…

bzoj 2146: Construct

Description 随着改革开放的深入推进…… 小T家要拆迁了…… 当对未来生活充满美好憧憬的小T看到拆迁协议书的时候&#xff0c;小T从一位大好的社会主义青年变成了绝望的钉子户。 由于小T的家位于市中心&#xff0c;拆迁工作又难以进行&#xff0c;有关部门决定先把小T家用围栏…