传送门
来源:牛客网
题目描述
uu是一个伟大的魔法师,她有n堆糖果。
由于她想得到更多的糖果,她可以施展无数次魔法,魔法的效果是她可以选择任意一堆糖果,使得那堆糖果的数量增加h,如果有任何一堆糖果的数量在施展魔法后超过了k,uu就会永远失去释放魔法的能力。
uu想知道她最多能得到多少颗糖果?
输入描述:
每组输入的第一行为n(1 <= n <= 2e6), k(1 <= k <= 1e9), h(0 <= h <= 1e9).
接下来一行为n个数字,代表每堆糖果的数量ai(1 <= ai <= 1e9)
输出描述:
输出一个整数,代表uu能得到最多糖果的数量。
示例1
输入
3 9 1
1 3 5
输出
28
示例2
输入
3 4 2
1 5 2
输出
14
可能会出现ai大于k的情况,需要考虑
麻烦的二分代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[2000020],n,k,h;
bool ch(ll x,int i){
ll ss=a[i]+h*x;
return ss<=k;
}
int main(){
ll sum=0;
scanf("%lld%lld%lld",&n,&k,&h);
for(ll i=0;i<n;i++){
scanf("%lld",&a[i]);
}
for(int i=0;i<n;i++){
ll l=0,r=1000000100;
while(l<r){
ll mid=l+r>>1;
if(ch(mid,i))l=mid+1;
else r=mid;
}
if(a[i]<k)
sum+=a[i]+(r-1)*h;
else sum+=a[i];
}
printf("%lld",sum+h);
return 0;
}
简单的思维方法:
#include <iostream>
using namespace std;
typedef long long ll;
int main(){
ll n,k,h,sum,a;
cin>>n>>k>>h;
for(int i=0;i<n;i++){
cin>>a;
if(a<k && h!=0){
a=a+((k-a)/h)*h;//妙啊~不超过k且每次增加h条件下a的最大值
}
sum+=a;
};
sum+=h;
cout<<sum;
return 0;
}
a=a+((k-a)/h)*h;
:求不超过k且每次增加h条件下a的最大值