题解
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[100005], n, m;
bool check(int x){
int cow = 1;
int sum = a[1] + x;
for(int i = 2; i <= n; i++)
{
if(a[i] < sum) continue;
cow++;
sum = a[i] + x;
}
if(cow >= m) return true;
else return false;
}
int main()
{
scanf("%d %d",&n, &m);
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
sort(a+1, a+n+1);
int l = 0, r = a[n] - a[1];
int mid, ans;
while(l <= r)
{
mid = (l+r) / 2;
if(check(mid) == true)
{
l = mid + 1;
ans = mid;
}
else r = mid - 1;
}
printf("%d\n",ans);
return 0;
}
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
long long a[100005], s[100005];
long long n, L;
long long ans;
bool check(long long x){
for(int i = 1; i <= n; i++)
s[i] = s[i-1] + a[i] - x;
long long minn = 99999999;
for(int i = L; i <= n; i++)
{
minn = min(minn, s[i-L]);
if(s[i] - minn >= 0) return true;
}
return false;
}
int main()
{
scanf("%d %d",&n, &L);
long long l, r;
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
a[i] *= 1000;
l = min(l, a[i]);
r = max(r, a[i]);
}
while(l <= r)
{
int mid = (l+r) / 2;
if(check(mid) == true)
{
l = mid+1;
ans = mid;
}
else r = mid - 1;
}
printf("%d\n",ans);
}
数列分段二
题解
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int n, m;
int a[1000005];
bool check(int x)
{
int k = 1, sum = 0; // k是组数
for(int i = 1; i <= n; i++)
{
if(sum + a[i] > x)// 加上a[i]若超过中间数 就将这个数分入下一组
{
sum = a[i];
k++; // 组数+1
}
else sum += a[i];
}
if(k <= m) return true; // 不能超过m段
return false;
}
int main()
{
scanf("%d %d",&n, &m);
int l = 0, r = 0, ans = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
r += a[i]; // 最大值(右边界)等于所有数的和
l = max(l, a[i]); // 最小值(左边界)等于单个的最大值
}
while(l <= r)
{
int mid = (l+r) / 2;
if(check(mid) == true) // 要求找最小值
{
ans = mid;
r = mid-1; // 往左边找(小一点的)
}
else l = mid+1;// 往右边找(大一点的)
}
printf("%d\n",ans);
return 0;
}
———————————————————学习更新—————————————————————