小蓝最近正在玩一款 RPG��� 游戏。
他的角色一共有 N� 个可以加攻击力的技能。
其中第 i� 个技能首次升级可以提升 Ai�� 点攻击力,以后每次升级增加的点数都会减少 Bi��。
⌈Ai/Bi⌉(上取整)次之后,再升级该技能将不会改变攻击力。
现在小蓝可以总计升级 M� 次技能,他可以任意选择升级的技能和次数。
请你计算小蓝最多可以提高多少点攻击力?
输入格式
输入第一行包含两个整数 N 和 M。
以下 N行每行包含两个整数 Ai 和 Bi。
想象为等差序列,把大于等于mid的cnt个数(>=m)存放到数组中即可得到最大攻击力。mid用二分法查找
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+10;
typedef long long LL;
int n,m;
int a[maxn],b[maxn];
bool check(int mid)
{
LL res=0;
for(int i=0;i<n;i++)
{
if(a[i]>=mid)
{
res+=(a[i]-mid)/b[i]+1;
}
}
return res>=m;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>a[i]>>b[i];
}
int l=0,r=1e6;
while(l<r)
{
int mid=l+r+1 >> 1;
if(check(mid)) l=mid;
else r=mid-1;
}
LL res=0,cnt=0;
for(int i=0;i<n;i++)
{
if(a[i]>=r)
{
int c=(a[i]-r)/b[i]+1;
int end=a[i]-(c-1)*b[i];
cnt+=c;
res+=(LL)(a[i]+end)*c/2;
}
}
cout<<res-(cnt-m)*r<<endl;
}