百炼 2774 切木头 还是没ac,总是re

来源:互联网 发布:斗地主软件源码 编辑:程序博客网 时间:2024/04/30 01:26

///////////////////////////////////////////////

我没用二分,难道是因为这个就?除0我也避免了,放在ideone.com也能跑,不知道为什么还是re.真蛋疼

#include<stdio.h>

#include<algorithm>
using namespace std;
int logg[10001];
int N,K;
int allLength(0);
int getResult(int N,int K);
int main(){
scanf("%d%d",&N,&K);
for(int i = 0;i < N;i++)
{
scanf("%d",logg[i]);
allLength += logg[i];
}
sort(logg,logg+N);
printf("%d\n",getResult(N,K));
return 0;
}
int getResult(int N,int K)
{
int maxNum = allLength / K;
for(int i = maxNum;i >= 0;i--)
{
int allNum(0);
for(int j = N - 1;j >= 0;j--)
{
if(logg[j] < i)
break;
if(i != 0)
allNum += logg[j] / i;
if(allNum >= K)
return i;
}
}
return 0;
}

/////////////////////////////////////////////

网上的二分

///////////////////////////////////////////

#include<iostream>
using namespace std;
int n,k;
int wood[15000];
bool check(int);
int main()
{
int sum=0;
cin>>n>>k;
int i;
for(i=0;i<n;i++) 
{
cin>>wood[i];
sum+=wood[i];
}
int longest=sum/k;
if(longest<1) cout<<"0\n";
else
{


int l=1,r=longest+1;
while(l<r-1)
{
int mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid-1;
}
if(l==r-1&&check(r))
cout<<r<<endl;
else cout<<l<<endl;
}
return 0;
}
bool check(int length)
{
int sum=0;
for(int i=0;i<n;i++)
{
sum+=wood[i]/length;
}
if(sum>=k) return 1;
else return 0;
}

0 0
原创粉丝点击