百练2774:木材加工题解

本文介绍了一个关于木材加工的问题,即如何将若干根原木切割成指定数量的等长小段,目标是使得这些小段尽可能长。文章提供了一种算法实现方案,包括主要的数据结构定义、关键函数设计及整体流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2774:木材加工

总时间限制: 
1000ms 
内存限制: 
65536kB
描述
木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目是给定了。当然,我们希望得到的小段越长越好,你的任务是计算能够得到的小段木头的最大长度。

木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是正整数。
输入

第一行是两个正整数NK(1 ≤ N ≤ 10000, 1 ≤ K ≤ 10000),N是原木的数目,K是需要得到的小段的数目。
接下来的N行,每行有一个1到10000之间的正整数,表示一根原木的长度。
 

输出
输出能够切割得到的小段的最大长度。如果连1厘米长的小段都切不出来,输出"0"。
样例输入
3 7
232
124
456
样例输出
114
来源
NOIP 2004

  • 查看 
  • 提交 
  • 统计 
  • 提示 
  • 提问
    • 代码:
    • #include <iostream>
      #include <cstdio>
      int d[100001],n,k;
      using namespace std;
      bool judge (int q){
      	if (q==0) return 0;
      	int sum=0;
      	for (int i=1;i<=n;i++){
      		sum=sum+(d[i]/q);
      	}
      	return (sum>=k);
      }
      int main(){
      	int i,p=0;scanf("%d%d",&n,&k);
      	int min=0;
      	for (i=1;i<=n;i++) {
      		scanf("%d",&d[i]);
      		if (d[i]>min) min=d[i];
      	}
      	if (!judge(1)) cout<<'0'<<endl;
      	else {
      		for (i=min;i>0;i-=100) {
      			if (judge(i)) break;
      		}
      		int u=i;
      		for (;i<=u+100;i++) {
      			if (judge(i)) p=i;
      		}
      		printf("%d\n",p);
      	}
      	return 0;
      }
      


### @Cacheable 缓存注解失效的原因分析 #### 失效原因 @Cacheable 注解失效的主要原因是由于 SpringAOP 切面机制依赖于代理对象。当方法被同一类内的其他方法调用时,实际上并未经过代理层,因此无法触发缓存逻辑[^1]。 此外,如果项目中未正确配置代理模式(如 JDK 动态代理或 CGLIB),也可能导致 @Cacheable 注解的功能未能正常工作[^4]。 --- ### 解决方案 #### 方法一:调整调用方式 确保目标方法通过代理对象调用,而是直接在同一类内调用。例如,在服务间交互时,应通过接口注入的方式实现跨 Bean 调用,而非直接调用本类中的方法。 ```java @Service public class MyService { @Autowired private MyService self; // 自身注入 public void callCachedMethod() { self.cachedMethod(); // 通过代理对象调用 } @Cacheable("myCache") public String cachedMethod() { return "Result"; } } ``` --- #### 方法二:使用 `AopContext.currentProxy()` 获取当前代理实例 在需要的地方显式地获取当前代理对象并调用目标方法。这种方式适用于必须在同一个类中调用的情况[^3]。 ```java import org.springframework.aop.framework.AopContext; @Service public class MyService { @Cacheable("myCache") public String cachedMethod() { return "Result"; } public void internalCall() { ((MyService) AopContext.currentProxy()).cachedMethod(); } } ``` > **注意**:此方法需启用 `expose-proxy` 属性为 true 才能正常使用。 --- #### 方法三:修改代理策略 Spring 默认会根据是否有接口决定采用哪种代理方式(JDK 动态代理或 CGLIB)。为了兼容更多场景,可以强制设置为 CGLIB 模式: ```properties spring.aop.proxy-target-class=true ``` CGLIB 方式的优点在于它可以直接代理具体类而局限于接口,从而减少因代理方式同而导致的潜在问题。 --- ### 配置 Ehcache 并验证缓存管理器 除了上述代理相关问题外,还需确认缓存管理器是否已正确定义。通常情况下,Spring 使用 `EhCacheCacheManager` 来集成第三方缓存工具。以下是典型的配置示例[^5]: ```xml <bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml"/> </bean> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <constructor-arg ref="ehCacheManager"/> </bean> ``` 如果没有提供自定义配置文件,默认会加载 `ehcache-failsafe.xml` 或者抛出异常提示找到配置文件。 --- ### 总结 @Cacheable 注解失效的核心问题是调用链路未经过代理对象。解决办法包括调整调用关系、利用 `AopContext.currentProxy()` 显式获取代理实例以及合理配置代理策略。同时,还需要检查缓存管理器及其关联组件是否按预期初始化完成。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值