Codeforces Round #291 (Div. 2) D. R2D2 and Droid Army (思维)

题目链接

题面:
在这里插入图片描述
题意:
有n个机器人站在一排,每个机器人有m个属性值,第 i 个机器人的 第 j 个属性值为 a [ i ] [ j ] 。
我现在有一把能发射 k 发子弹的枪,我可以选择每发子弹种类(如果某发子弹的种类为 j ,则其只能对所有机器人的 j 属性值造成伤害,使所有机器人的 j 属性值 -1)。如果一个机器人的 m 个属性值都降至 <=0,那么这个机器人就会死亡。输出子弹怎样分配,才能使连续死亡的机器人最多。
子弹可以不用完。

题解:
枚举+尺取
用 multiset 维护 到当前位置 i 的第 j 的属性的最大值。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<bitset>
#include<map>
#include<set>
#define ll long long
#define llu unsigned ll
#define pr make_pair
#define pb push_back
#define ui unsigned int
#define lc (cnt<<1)
#define rc (cnt<<1|1)
#define len(x)  (t[(x)].r-t[(x)].l+1)
#define tmid ((l+r)>>1)
#define forhead(x) for(int i=head[(x)];i;i=nt[i])
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e18;
const int mod=1000000007;
const double eps=1e-8;
const double pi=acos(-1.0);
const int maxn=100100;
const int maxm=100100;
const int up=100000;
const int hashp=13331;
const int hashpp=131;

int a[maxn][6];
int ans[6];
multiset<int>se[6];

int main(void)
{
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    }
    int l=1,maxx=0;
    for(int r=1;r<=n;r++)
    {
        for(int i=1;i<=m;i++)
            se[i].insert(a[r][i]);
        while(l<=r)
        {
            int ans=0;
            for(int i=1;i<=m;i++)
                ans+=*(--se[i].end());
            if(ans<=k) break;
            for(int i=1;i<=m;i++)
                se[i].erase(se[i].find(a[l][i]));
            l++;
        }
        if(r-l+1>maxx)
        {
            maxx=r-l+1;
            for(int i=1;i<=m;i++)
                ans[i]=*(--se[i].end());
        }

    }
    for(int i=1;i<=m;i++)
        printf("%d ",ans[i]);
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值