二分答案(Widespread )

2023-10-17 21:10
文章标签 二分 答案 widespread

本文主要是介绍二分答案(Widespread ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二分答案其实是变相贪心,这周算是被这个虐了,怎么都想不到,比如这题,一直纠结在最大值的贪心上后面队友一指点,原来可以先减去x*b,然后a-b随机分配就好了,

仔细一想没错呀,每次攻击必然受到x*b次伤害而剩下的x个a-b就可以随机分配给每个怪物,注意是成对分而不能求和。说下二分答案吧

二分前提

1.答案区间上下限确定,即最终答案在哪个范围是容易知道的。

2.检验某值是否可行是个简单活,即给你个值,你能很容易的判断是不是符合题目要求。

3.可行解满足区间单调性,即若x是可行解,则在答案区间内x+1(也可能是x-1)也可行。

二分转换如下,但是检验是否成立就需要对题目的分析了。

1.最小值最大化

int l = min_ans, r = max_ans;
while (l < r) {int mid = (l + r + 1) / 2;   //+1避免 r == l + 1 时mid一直等于l,从而死循环if (ok(mid))    //符合条件返回Truel = mid;elser = mid - 1;
}

2.最大值最小化

1 int l = min_ans, r = max_ans;
2 while (l < r) {
3     int mid = (l + r) / 2;
4     if (ok(mid))    //符合条件返回True
5         r = mid;
6     else
7         l = mid + 1;
8 }

题目:

You are going out for a walk, when you suddenly encounter N monsters. Each monster has a parameter called health, and the health of the i-th monster is hi at the moment of encounter. A monster will vanish immediately when its health drops to 0 or below.

Fortunately, you are a skilled magician, capable of causing explosions that damage monsters. In one explosion, you can damage monsters as follows:

  • Select an alive monster, and cause an explosion centered at that monster. The health of the monster at the center of the explosion will decrease by A, and the health of each of the other monsters will decrease by B. Here, A and B are predetermined parameters, and A>B holds.

At least how many explosions do you need to cause in order to vanish all the monsters?

Constraints

 

  • All input values are integers.
  • 1≤N≤105
  • 1≤B<A≤109
  • 1≤hi≤109

Input

 

Input is given from Standard Input in the following format:

N A B
h1
h2
:
hN

Output

 

Print the minimum number of explosions that needs to be caused in order to vanish all the monsters.

Sample Input 1

 

4 5 3
8
7
4
2

Sample Output 1

 

2

You can vanish all the monsters in two explosion, as follows:

  • First, cause an explosion centered at the monster with 8 health. The healths of the four monsters become 341 and −1, respectively, and the last monster vanishes.
  • Second, cause an explosion centered at the monster with 4 health remaining. The healths of the three remaining monsters become 0−1 and −2, respectively, and all the monsters are now vanished.

Sample Input 2

 

2 10 4
20
20

Sample Output 2

 

4

You need to cause two explosions centered at each monster, for a total of four.

Sample Input 3

 

5 2 1
900000000
900000000
1000000000
1000000000
1000000000

Sample Output 3

 

800000000
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iomanip>
 6 #include<algorithm>
 7 using namespace std;
 8 #define eps 1e-7
 9 #define maxi 100005
10 long long  h[maxi];
11 long long hi[maxi];
12 long long  n,a,b;
13 long long in=10000000000;
14 bool C(long long  x){
15     long long t=x;
16     for(long long i=0;i<n;i++)
17         hi[i]=h[i];
18     for(long long i=0;i<n;i++){
19         hi[i]-=x*b;
20         if(hi[i]<=0) continue;
21         long long y;
22         if(hi[i]%(a-b)==0)
23           y=hi[i]/(a-b);
24         else
25             y=hi[i]/(a-b)+1;
26         t-=y;
27     }
28     if(t>=0) return true;
29     return false;
30 }
31 void solve(){
32     sort(h,h+n);
33 long long  lb=0,ub=in;
34    while(ub-lb>1){
35         long long mid=(lb+ub)/2;
36         //cout<<mid<<" "<<C(mid)<<" "<<ub<<endl;
37         if(C(mid)) ub=mid;
38         else  lb=mid;
39         //cout<<lb<<" "<<ub<<endl;
40     }
41     cout<<ub<<endl;
42 }
43 int main()
44 {
45            scanf("%d%d%d",&n,&a,&b);
46    for(int i=0;i<n;i++)  scanf("%d",&h[i]);
47   solve();
48    return 0;
49 }
View Code

 



转载于:https://www.cnblogs.com/blvt/p/7846596.html

这篇关于二分答案(Widespread )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/227978

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

poj 3104 二分答案

题意: n件湿度为num的衣服,每秒钟自己可以蒸发掉1个湿度。 然而如果使用了暖炉,每秒可以烧掉k个湿度,但不计算蒸发了。 现在问这么多的衣服,怎么烧事件最短。 解析: 二分答案咯。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <c

poj 3258 二分最小值最大

题意: 有一些石头排成一条线,第一个和最后一个不能去掉。 其余的共可以去掉m块,要使去掉后石头间距的最小值最大。 解析: 二分石头,最小值最大。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <c

poj 2594 二分图最大独立集

题意: 求一张图的最大独立集,这题不同的地方在于,间接相邻的点也可以有一条边,所以用floyd来把间接相邻的边也连起来。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <sta

poj 3692 二分图最大独立集

题意: 幼儿园里,有G个女生和B个男生。 他们中间有女生和女生认识,男生男生认识,也有男生和女生认识的。 现在要选出一些人,使得这里面的人都认识,问最多能选多少人。 解析: 反过来建边,将不认识的男生和女生相连,然后求一个二分图的最大独立集就行了。 下图很直观: 点击打开链接 原图: 现图: 、 代码: #pragma comment(

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

POJ2413二分

注意二分, 上界。 import java.beans.beancontext.BeanContext;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrite