2024/12/28课堂记录

目录

  1. 最大连续和
  2. 木材加工(月度开销)
  3. 跳石头
  4. 作业:修剪草坪

最大连续和

复习一下

这次只写了朴素的dp版,注意,不要用贪心,因为单调队列只能优化dp
很简单,注释都不用写了

#include<iostream>
using namespace std;
int a[200010],f[200010];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		a[i]=a[i-1]+x;
	}
	//for(int i=1;i<=n;i++)cout<<a[i];
	int ans=-0x3f3f3f3f;
	for(int i=1;i<=n;i++)
	{
		f[i]=-0x3f3f3f3f;
		for(int j=i-1;j>=max(i-m,1);j--)f[i]=max(f[i],a[i]-a[j]);
		ans=max(ans,f[i]);
	}
	cout<<ans;
	return 0;
}

木材加工月度开销

二分答案模版题

 #include<iostream>
using namespace std;
int a[100010];
int n,k,r=-1,l=1,ans=0;
bool half(int mid)
{
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		int x=a[i];
		while(x>=mid)
		{
			x-=mid;
			sum++;
		}
	}
	if(sum>=k)return 1;
	else return 0;
}
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)r=max(r,a[i]);
	while(l<=r)
	{
//		cout<<"hhh";
		int mid=(l+r)/2;
		if(half(mid)==1)l=mid+1,ans=mid;
		else r=mid-1;
	}
	cout<<ans;
	return 0;
}

跳石头

与平常二分不同,跳石头在函数内部通过其他方式来检验合理性
具体的也写注释了

 #include<iostream>
using namespace std;
long long int l,n,m,ans=0;
long long int a[50010];
bool half(long long int mid)
{
	long long int sum=0,now=0;//sum:可以去掉的石头总个数,now:现在跳到第几块石头上(下标 
	for(long long int i=1;i<=n+1;i++)
	{
		if(a[i]-a[now]<mid)sum++;//现在站的石头与面前的石头(可能已经移掉几块了)的距离 比预计距离小 
		else now=i;//距离比预计距离大 
	}
	if(sum<=m)return 1;
	else return 0;
}
int main()
{
	cin>>l>>n>>m;
	for(long long int i=1;i<=n;i++)cin>>a[i];
	long long int r=l;l=0;
	a[n+1]=r;
	while(l<=r)
	{
		long long int mid=(l+r)/2;
		if(half(mid)==1)ans=mid,l=mid+1;
		else r=mid-1;
	}
	cout<<ans;
	return 0;
}

金句摘抄:任何甜味回味起来都是苦的,因为回味意味着甜味早已消失殆尽