1929. 懒惰的奶牛[b](lazy_bronze)

懒惰奶牛的草地盛宴
在夏日的田野上,一只名叫贝里斯的懒惰奶牛想要找到最佳位置,以便在不超过K的距离内吃到最多的青草。面对N块直线排列的草坪,每块草坪有特定的青草数量和位置,如何利用前缀和算法帮助贝里斯计算最大青草收获量成为了解决的关键。

1929. 懒惰的奶牛[b](lazy_bronze)

题目描述
夏天又到了,奶牛贝里斯开始变得非常懒惰。他想要站在一个地方,然后只走很少的一段路,就能吃到尽可能多的美味的青草。有N块草坪排列在一条直线上,第i个草坪拥有g_i数量的青草,第i个草坪所在的位置是x_i。奶牛贝里斯想要在直线上选择一个点作为他的初始点(初始点有可能和草坪的位置重合),这样他就能吃到以这个点为中点距离不超过K的位置上的所有青草。如果初始点可以自由选择的话,请帮助贝里斯计算他最多能吃到的青草的数量。

输入
第一行是两个正整数,表示N和K。
第2行到第N+1行,每行两个整数,第i行的两个整数表示第i个草坪的g_i和x_i。

输出
输出贝里斯最多能吃到的青草数量。

样例输入

4 3 
4 7 
10 15 
2 2 
5 1

样例输出

 11

数据范围限制
1<=N<=100000,1<=g_i<=10000,0<=x_i<=1000000,1<=k<=2000000。

提示
如果贝里斯将初始点选择在x=4的位置,那么他可以吃到x=1,x=2和x=7这三个地方的青草,总共是11。

思路:
这道题就是求一个最大的区间和,那么我们就会想到前缀和。那如何去枚举每一个区间,其实就是去枚举每一个区间的右边界。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=5e6+5;
long long n,k,g,x,t[N],ans=-1;
int main()
{
	fre(lazy_bronze);
	scanf("%lld%lld",&n,&k);
	for(long long i=1;i<=n;i++) 
	scanf("%lld%lld",&g,&x),t[x]=g;
	for(long long i=1;i<=N;i++) t[i]+=t[i-1];
	for(long long i=N;i>=2*k;i--) 
	{
		
		if(i==2*k) ans=max(ans,t[i]);
			else ans=max(ans,t[i]-t[i-2*k-1]);
	}	
	printf("%lld",ans);
	return 0;
}
An exception was thrown while activating VOL.System.Repositories.Sys_File_InfoRepository -> VOL.System.Repositories.Sys_File_InfoRepository.Autofac.Core.DependencyResolutionException: Circular component dependency detected: VOL.System.Repositories.Sys_File_InfoRepository -> VOL.System.Repositories.Sys_File_InfoRepository -> VOL.System.Repositories.Sys_File_InfoRepository. at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext context) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext context) at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest& request) at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() at Autofac.Core.Activators.Reflection.ReflectionActivator.<>c__DisplayClass14_0.<UseSingleConstructorActivation>b__0(ResolveRequestContext context, Action`1 next) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext context) at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext context) at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next)这也出这样的问题
最新发布
08-21
你遇到的错误是典型的 **Autofac 循环依赖问题**,异常信息如下: ``` Circular component dependency detected: VOL.System.Repositories.Sys_File_InfoRepository -> VOL.System.Repositories.Sys_File_InfoRepository -> VOL.System.Repositories.Sys_File_InfoRepository. ``` --- ## 🧨 问题分析 这个错误说明你正在尝试注册或使用一个类时,它 **依赖了自己**,导致 Autofac 无法解析依赖关系。 ### 常见原因有: 1. **构造函数中注入了自己**(即 `Sys_File_InfoRepository` 注入了 `Sys_File_InfoRepository`) 2. **配置错误**:注册方式不正确,导致 Autofac 把某个类当成服务和实现同时注册了 3. **继承或泛型导致的隐式依赖** --- ## ✅ 示例:构造函数中自引用导致循环依赖 ```csharp public class Sys_File_InfoRepository { public Sys_File_InfoRepository(Sys_File_InfoRepository repo) { // 这里自己注入自己,直接导致循环依赖 } } ``` --- ## ✅ 解决方案 ### ✅ 1. **检查构造函数是否注入了自己** 打开 `Sys_File_InfoRepository.cs` 文件,查看构造函数是否有类似如下代码: ```csharp public class Sys_File_InfoRepository : ISomeInterface { public Sys_File_InfoRepository(Sys_File_InfoRepository self) { // ❌ 自己注入自己,导致循环依赖 } } ``` **解决方法:** - 如果是误操作,直接删除构造函数中的自引用 - 如果确实需要访问自身,考虑使用 `Lazy<T>` 或 `Func<T>` 延迟加载 ```csharp public class Sys_File_InfoRepository : ISomeInterface { private readonly Func<Sys_File_InfoRepository> _selfFactory; public Sys_File_InfoRepository(Func<Sys_File_InfoRepository> selfFactory) { _selfFactory = selfFactory; } public void SomeMethod() { var self = _selfFactory(); // 使用 self 做后续操作 } } ``` --- ### ✅ 2. **检查注册代码是否重复注册了类** 在 `Autofac` 的模注册中,是否不小心将 `Sys_File_InfoRepository` 同时注册为服务和实现? ```csharp builder.RegisterType<Sys_File_InfoRepository>() .AsSelf() // 注册自己为服务 ❌ .As<ISys_File_InfoRepository>() // 正确 .InstancePerLifetimeScope(); ``` **解决方法:** 只注册接口映射,不要注册 `AsSelf()`,除非你真的需要通过类型直接解析: ```csharp builder.RegisterType<Sys_File_InfoRepository>() .As<ISys_File_InfoRepository>() .InstancePerLifetimeScope(); ``` --- ### ✅ 3. **检查是否使用了错误的泛型注册方式** 如果你用了类似下面的泛型注册方式: ```csharp builder.RegisterGeneric(typeof(Sys_File_InfoRepository<>)) .As(typeof(IRepository<>)); ``` 确保泛型类没有错误地引用了自己。 --- ### ✅ 4. **使用 Lazy<T> 解决构造函数循环依赖** 如果你在某个类中注入了 `Sys_File_InfoRepository`,而它又反过来依赖你当前的类,可以使用 `Lazy<T>` 延迟加载: ```csharp public class SomeOtherService { private readonly Lazy<Sys_File_InfoRepository> _fileRepo; public SomeOtherService(Lazy<Sys_File_InfoRepository> fileRepo) { _fileRepo = fileRepo; } public void DoSomething() { var repo = _fileRepo.Value; // 延迟加载 repo.DoWork(); } } ``` --- ### ✅ 5. **重构设计:避免自引用** 如果 `Sys_File_InfoRepository` 确实需要调用自己的方法,建议: - 抽出一个接口 `ISys_File_InfoRepository` - 把公共方法抽象到接口中 - 通过接口调用,而不是直接注入具体类 ```csharp public interface ISys_File_InfoRepository { void SomeMethod(); } public class Sys_File_InfoRepository : ISys_File_InfoRepository { private readonly ISys_File_InfoRepository _repo; public Sys_File_InfoRepository(ISys_File_InfoRepository repo) { _repo = repo; // ✅ 接口注入自己是可以的 } public void SomeMethod() { _repo.SomeMethod(); // 通过接口调用 } } ``` --- ## ✅ 总结:解决 Autofac 循环依赖的常用方式 | 方法 | 适用场景 | 说明 | |------|----------|------| | 删除构造函数中的自引用 | 直接注入自己的类 | 最简单有效 | | 使用 Lazy<T> 延迟加载 | 构造函数中需要依赖自己 | 避免立即加载 | | 使用 Func<T> 工厂注入 | 需要动态获取实例 | 更灵活 | | 接口抽象 + 接口注入 | 多个类互相依赖 | 更好的设计 | | 重构依赖结构 | 依赖链复杂 | 从根本上解决问题 | --- ## ✅ 建议检查点 1. 打开 `Sys_File_InfoRepository` 类,检查构造函数 2. 检查 Autofac 注册代码是否重复注册了类本身 3. 检查是否有接口缺失,导致必须注入具体类 4. 查看是否多个仓储互相注入(A 依赖 B,B 依赖 C,C 依赖 A) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值