求助,题解格式哪里有问题
  • 板块灌水区
  • 楼主月野秋见
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/5/30 06:57
  • 上次更新2023/11/4 22:31:55
查看原帖
求助,题解格式哪里有问题
490997
月野秋见楼主2021/5/30 06:57

二分标准题目

没有康过题目的小伙伴可以先看下。 题目传送门

首先,这题是道二分查找,所以先写二分,左端点和右端点都是来找出最小嫉妒值。

while(l<r){
	int mid=(l+r)/2;
	//cout<<endl<<mid;
	//cout<<endl<<enough_(mid)<<endl;
	if(enough_(mid)==1)r=mid;
	else l=mid+1;
}

然后就是enough_函数了。

bool enough_(int x){
    int ans=0;
    for(int i=1;i<=m;i++)ans+=(c[i]-1)/x+1;
    if(ans<=n)return 1;
    else return 0;
}

写函数好习惯:在函数后面加上一个_或者用他的过去式(如changed,painted等)。

之后就是愉快的补全代码环节了,但是在此之前,我们需要找到最开始的left和right,left至少是1,right则是其中一种颜色最多的(应为最大的x)

r=-1;
l=1;
for(int i=1;i<=m;i++)
if(c[i]>r)r=c[i];

最后献上完整代码:

#include<bits/stdc++.h>
using namespace std;
int m,n,c[300001]={0},l,r;
bool enough_(int x){
    int ans=0;
    for(int i=1;i<=m;i++)ans+=(c[i]-1)/x+1;
    if(ans<=n)return 1;
    else return 0;
}
int main(){
	r=-1;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
        cin>>c[i];
    l=1;
    for(int i=1;i<=m;i++)
    	if(c[i]>r)r=c[i];
    while(l<r){
        int mid=(l+r)/2;
        if(enough_(mid)==1)r=mid;
        else l=mid+1;
    }
    cout<<r;
    return 0;
}

拒绝代码复制,共建美好洛谷。

2021/5/30 06:57
加载中...