链接:
https://codeforces.com/problemset/problem/1561/C
题意:
英雄打怪兽,英雄攻击力大于怪兽防御力时才能击杀,每杀一只怪兽攻击力上升一点
给你n个数组,第i个数组ki个数字,表示怪兽的防御力
可以选择任意一个数组开始,但是在数组中得按顺序打怪
求英雄杀光怪兽的最低起始攻击力
解:
首先对每个数列求英雄通过的最低起始攻击力,和通关加成
然后排序最低起始攻击力,从小到大,分开记录加成和攻击力,
无法通过时提升攻击力到该数列最低起始攻击力
通过后提升加成记录
实际代码:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#define csh(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long int ll;
const int N=1E5+5;
struct DX
{
ll powneed;
ll zf;
};
DX dx[N];
bool bmp(const DX &A,const DX &B)
{
if(A.powneed<B.powneed) return true;
else if(A.powneed==B.powneed)
{
return A.zf>B.zf;
}
else return false;
}
int main()
{
int t;
cin>>t;
for(int f=1;f<=t;f++)
{
ll n;
cin>>n;
for(int i=1;i<=n;i++)
{
ll k;
cin>>k;
dx[i].zf=k;
ll pow=0;
for(int j=1;j<=k;j++)
{
ll temp;
cin>>temp;
ll zf=j-1;
if((zf+pow)<=temp)
{
pow+=temp-zf-pow+1;
}
}
//cout<<i<<"DX "<<pow<<"and "<<k<<endl;
dx[i].powneed=pow;
}
sort(dx+1,dx+n+1,bmp);
ll pow=0;
ll zf=0;
for(int i=1;i<=n;i++)
{
//cout<<"old pow"<<pow<<endl<<"need pow"<<dx[i].powneed;
//cout<<"get zf"<<zf<<endl;
if(pow+zf<dx[i].powneed)
{
pow+=dx[i].powneed-pow-zf;
//cout<<"new pow"<<pow<<endl;
}
zf+=dx[i].zf;
}
cout<<pow<<endl;
}
}
限制:
time limit per test
2 seconds
memory limit per test
512 megabytes
input
standard input
output
standard output