目录
C 合成闪光百变怪(百分号的读入)
题目
代码
D 颠倒阴阳(二进制转换)
题目
代码
F 分鸽子(二分查找)
代码
二分练习题
1.分巧克力
2.分木材
什么时候用二分法?
C 合成闪光百变怪(百分号的读入)
链接:https://ac.nowcoder.com/acm/contest/130796/C
来源:牛客网
题目
代码
#include<bits/stdc++.h> using namespace std; int main() { double p[7]; for (int i=0;i<7;i++) { scanf("%lf%%",p+i); //读取带百分号 % 的输入数字 可以正确读进去 50.0 } int c,f; cin>>c>>f; double ans=p[c]; if (f==1) { ans*=0.01; } else { ans*=0.99; } printf("%.2f%%\n",ans); //第一个 % 是转义符 第二个 % 才是真正输出的 % 符号 return 0; }D 颠倒阴阳(二进制转换)
题目![]()
碰巧写出来而已
代码
#include<iostream> #include<cstdio> #include<cstring> using namespace std; long long sum=0,n; int r; long long s; int main() { scanf("%d",&n); int i=0; while(n>0) { r=n%2; n=n/2; if(r==0) { r=1; s=1; for(int q=1;q<=31-i;q++) { s*=2; } sum+=s; } else if(r==1) { r=0; sum+=0; } i++; } printf("%lld",sum); return 0; }F 分鸽子(二分查找)
链接:https://ac.nowcoder.com/acm/problem/205725
来源:牛客网
Reverie想要把一些鸽子分给协会里的小伙伴。她有 n 只重量不同的鸽子,要分给 m 个小伙伴。每个小伙伴分到的鸽子肉重量要相等,并且都是非负整数。一个人分到的鸽子肉不能来自于两只及以上的鸽子,因为这样会串味儿。
请你帮Reverie计算一下,每个小伙伴最多能分到多少鸽子肉。.
输入
第一行两个正整数 n, m,分别表示鸽子的数量和小伙伴的数量。 第二行 n 个正整数,表示 n 只鸽子的重量。输出
一行内输出一个非负整数,表示每个小伙伴分到的鸽子肉重量。代码
#include<iostream> #include<cstdio> using namespace std; long long n,m; int a[100005]; bool check(int x); int main() { scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } int l=1;int r=0x3f3f3f3f;//接近 10^9 的整数 int ans=0; while(l<=r) { int mid=(l+r)/2; if(check(mid)) { ans=mid; l=mid+1; } else { r=mid-1; } } printf("%d\n",ans); return 0; } bool check(int x) { int cnt=0; for(int i=1;i<=n;i++) { cnt+=a[i]/x; if(cnt>=m) { return true; } } return false; }二分练习题
1.分巧克力
#include<iostream> #include<cstdio> using namespace std; long long n,k; int h[100005],w[100005]; int a[100005]; bool check(int mid); int main() { scanf("%lld%lld",&n,&k); for(int i=1;i<=n;i++) { scanf("%d %d",&h[i],&w[i]); } int l=1,r=100000; int ans=0; while(l<=r) { int mid=(l+r)/2; if(check(mid)) { ans=mid; l=mid+1; } else { r=mid-1; } } printf("%d",ans); } bool check(int x) { int cnt=0; for(int i=1;i<=n;i++) { cnt+=(h[i]/x)*(w[i]/x); if(cnt>=k) { return true; } } return cnt>=k; }2.分木材
#include<bits/stdc++.h> using namespace std; const int N=(int)1e5+10; int a[N]; int n,m; bool check(int x); int main() { cin>>n>>m; for (int i=1;i<=n;i++) { scanf("%d",a+i); } int l=1,r=0x3f3f3f3f,ans=0; while (l<=r) { int mid=(l+r)/2; if (check(mid)) { ans=mid; l=mid+1; } else { r=mid-1; } } cout<<ans<<endl; return 0; } bool check(int x) { int cnt=0; for (int i=1;i<=n;i++) { cnt+=a[i]/x; if (cnt>=m) { return true; } } return false; }什么时候用二分法?
只要同时满足这2 条,就用二分:
- 答案有范围(能写出:最小可能~最大可能)
- 具有单调性:
- 答案越大,越容易满足条件
- 答案越小,越难满足条件