武汉理工大学 E题:HearthStone
题意:
每个怪物有三个属性组成,分别是x(攻击力),y(生命值),z(亡语,即死后可召唤的x=1,y=1,z=0的怪物的数量)
lygg只有一个怪物,且不会主动攻击,并且保证不会被打死;
每次碰撞双方都会收到对方的伤害;
场地位置有限;
问lygg的 怪物剩余血量有几种可能;
思路:
经证明可得lygg可能剩余血量是连续的,故只需将将最大值-最小值+1即可求出答案;
最大值:让召唤出来的最少,即将z>0的先攻击,使后面的亡语没有位置;
最小值:让召唤出来的最多,先攻击z最少的,并及时清理召唤出来的,为后面召唤尽可能提供更多的场地;
#include<iostream>
#include<string>
#include<algorithm>
#include<math.h>
using namespace std;
long long int now, limit, d, sum = 0;
struct A
{
long long int num;
long long int z;
}a[1000010];
bool cmp1(A x, A y)
{
return x.z < y.z;
}
int main()
{
int t;
cin >> t;
while (t--)
{
long long int n, x, y;
cin >> limit >> n >> x >> y;
for (int i = 1; i <= n; i++)
{
cin >> a[i].z >> a[i].num;
sum += a[i].num;
}
if (x == 0)
{
cout << 1 << endl;
continue;
}
sort(a + 1, a + 1 + n, cmp1);
long long int max = y, min = y;
now = limit - sum;
long long int maxnow = sum;
for (int i = 1; i <= n; i++)
{
if (a[i].z == 0)
continue;
max -= a[i].num;
if (limit >= maxnow + (a[i].z - 1) * a[i].num)
maxnow = maxnow + (a[i].z - 1) * a[i].num;
else
maxnow = limit;
}
max = max - maxnow;
for (int i = 1; i <= n; i++)
{
if (a[i].z + sum - 1 > limit)
{
long long int d = sum + a[i].z - 1 - limit;
if (a[i].num >= d)
{
min = min - d * (limit - sum + 1 + limit - sum + d) / 2 - d;
min = min - (a[i].num - d) * (a[i].z + 1);
}
else
{
min = min - a[i].num * (limit - sum + 1 + limit - sum + a[i].num) / 2 - a[i].num;
}
}
else
min = min - a[i].num * (a[i].z + 1);
sum -= a[i].num;
}
cout << max - min + 1 << endl;
}
return 0;
}