题面:
题意:
有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;
}