天梯赛选拔赛1补题
2026/8/28 8:37:57 网站建设 项目流程

目录

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; }
  1. 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 条,就用二分:

  1. 答案有范围(能写出:最小可能~最大可能)
  2. 具有单调性
    • 答案越大,越容易满足条件
    • 答案越小,越难满足条件

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询