链接:https://codeforces.ml/problemset/problem/1561/C
题意:自己上机翻;
题解:
找出每个洞穴通关所需的最小战斗力和通关后的战斗力,组成一对,对所有这样的对子排序,然后能连起来,连不起来加战斗力,具体看代码;
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool bmp(pair<ll, ll>a, pair<ll, ll>b)
{
return a.first < b.first;
}
pair<ll, ll>a[100005];
int main()
{
ll t;
cin >> t;
while (t--)
{
ll m, n;
cin >> m;
ll cnt = 0;
while (m--)
{
cin >> n;
ll p = 0;
for (ll i = 0; i < n; i++)
{
ll x;
cin >> x;
p = max(p, x - i + 1);
}
a[cnt].first = p;
a[cnt].second = p + n;
cnt++;
}
sort(a, a + cnt, bmp);
//for (int i = 0; i < cnt; i++)
//{
// cout << a[i].first << " " << a[i].second << endl;
//}
ll k = a[0].first;
for (int i = 1; i < cnt; i++)
{
if (a[i - 1].second < a[i].first)
{
k += a[i].first - a[i - 1].second;
}
else
{
int temp = a[i].second - a[i].first;
a[i].first = a[i - 1].second;
a[i].second = a[i].first + temp;
}
}
cout << k << endl;
}
}