P8647 [蓝桥杯 2017 省 AB] 分巧克力 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
一图说清下述两种代码孰对孰错的原因:
错误代码:
#include<iostream> #include<algorithm> #include<cmath> using namespace std; #define ios_base \ ios::sync_with_stdio(false);\ cin.tie(nullptr),cout.tie(nullptr) const int N =1e5+10; int n,k,t1,t2=3e6; //*** int h[N],w[N]; bool check(int mid); int main() { ios_base; cin>>n>>k; for (int i = 0; i < n; i++) { cin>>h[i]>>w[i]; t1=min(h[i],w[i]); //*** t2=min(t2,t1); //*** } int l=1,r=t2;//*** while (l<r) { int mid=l+r+1>>1;//如果tle多半是此处写错,作+1修正即可(mid=l+r+1>>1) if(check(mid)) { l=mid; } else r=mid-1; } cout<<r; return 0; } bool check(int mid) { int num=0;//num表示在巧克力边长为mid的情况下能分给多少个小朋友 for (int i = 0; i < n; i++) { num+=(h[i]/mid)*(w[i]/mid); if (num>=k) return true; } return false; }
正确代码:
#include<iostream> #include<algorithm> #include<cmath> using namespace std; #define ios_base \ ios::sync_with_stdio(false);\ cin.tie(nullptr),cout.tie(nullptr) const int N =1e5+10; int n,k; int h[N],w[N]; bool check(int mid); int main() { ios_base; cin>>n>>k; for (int i = 0; i < n; i++) { cin>>h[i]>>w[i]; } int l=1,r=5e6; while (l<r) { int mid=l+r+1>>1;//如果tle多半是此处写错,作+1修正即可(mid=l+r+1>>1) if(check(mid)) { l=mid; } else r=mid-1; } cout<<r; return 0; } bool check(int mid) { int num=0;//num表示在巧克力边长为mid的情况下能分给多少个小朋友 for (int i = 0; i < n; i++) { num+=(h[i]/mid)*(w[i]/mid); if (num>=k) return true; } return false; }
标签:二分,巧克力,false,int,ios,mid,cin,include From: https://www.cnblogs.com/shinnyblue/p/17284962.html