前言
C - Bugged
T
a
g
:
Tag :
Tag: 优先队列
贪心
题意 :
给定你
N
N
N个数,询问你可以拼成的最大的不被10整除的数,如果没有输出0
思路 :
我们考虑先将所有数加起来,然后再从小到大减去不被10整除的数,直到该数不被10整除为止
code :
void solve(){
Pri_m q;
cin>>n;
Fup(i,1,n){
cin>>a[i];
sum+=a[i];
if(a[i]%10!=0){
q.push(a[i]);
}
}
// cout<<sum<<endl;
while(sum%10 == 0 && !q.empty()){
sum -= q.top();
q.pop();
}
if(sum%10 == 0 ) cout<<0<<endl;
else cout<<sum<<endl;
}
D - Widespread
t
a
g
:
tag :
tag: 贪心
二分
题意 :
给定
N
N
N个怪物,每个怪物有血量
H
i
H_i
Hi,你可以对任意的怪物进行攻击造成
A
A
A伤害,并使得其他怪物掉
B
B
B血。询问所有怪物生命值降为最低的操作次数
思路 :
显然答案是满足单调的,从杀不死到可以杀死
我们假设攻击所有怪物 x x x次,攻击第 i i i个怪物 k k k次
那么这个怪物所受到的所有伤害是
(
x
−
k
)
∗
B
+
k
∗
A
(x-k)*B+k*A
(x−k)∗B+k∗A即
x
∗
B
+
k
∗
(
A
−
B
)
x*B+k*(A-B)
x∗B+k∗(A−B)
因此我们可以根据这个公式进行二分
code :
ll h[N];
ll n,a,b;
int i;
bool check(ll x){
ll d = a - b ;
ll cnt = 0 ;
Fup(i,1,n){
ll temp = h[i] - b*x;
if(temp <= 0 ) continue;
cnt += temp/d;
cnt += (temp%d!=0);
if(cnt > x)return false;
}
return true;
}
void solve(){
cin>>n>>a>>b;
Fup(i,1,n) cin>>h[i];
ll l = 0 , r = 1e9;
ll ans = r;
while(l<=r){
ll mid = (l+r)>>1;
if(check(mid)){
r = mid - 1;
ans = min(mid,ans);
}else l = mid + 1;
}
cout<<ans<<endl;
}