CF ECR126 C. Water the Trees

本文探讨了一道关于通过加法操作使数组元素达到相同值的编程问题,关键策略在于利用奇数天加1,偶数天加2的模式,并运用二分查找优化天数计算。通过枚举奇数和偶数天数,确定是否能达成目标数组状态。

 Problem - C - Codeforces

题目大意:一个数组通过加法操作,最终让所有数字都相同。奇数天+1,偶数天+2,问最少多少天能达到目标。

解题思路:由于只能添加1,2,1,2,1,2,1......这样的次序。对于6 6 6 6 7 6 6 6 6这样的序列,最终都变成8比变成7会更好。因此,让所有数字都和最大数字相同或者是和最大数字+1相同。

那么如何计算天数呢,容易想到的是一个数和最大值的差值除3,但是稍一思考就知道除3的余数很难处理。对于极值问题另一个思路是二分算法,枚举答案的天数X得到 X-X/2  个1   和  X/2    个2,看看用这些数字是否足够把数组变成相同值。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll t,n,a[300005],maxv;
int check(ll odd,ll even,ll maxl)
{
    for(int i=1; i<=n; i++)
    {
        if(a[i]<maxl)
        {
            ll x=maxl-a[i];
            if(x/2<=even)/**< 优先使用偶数天填充 */
                even-=x/2,odd-=x%2;
            else
            { 
                x-=even*2;
                even=0;
                odd-=x;
            }
        }
        if(odd<0)
                return 0;
    }
    return 1;
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int i,j;
    cin>>t;
    while(t--)
    {
        cin>>n;
        maxv=0;
        for(i=1; i<=n; i++)
            cin>>a[i],maxv=max(maxv,a[i]);
        ll l=0,r=1e18,mid,best=0;
        while(l<=r)
        {
            mid=(l+r)/2;/**< 枚举天数,三个参数分别是奇数天数量,偶数天数量,最大值 */
            if(check(mid-mid/2,mid/2,maxv)||check(mid-mid/2,mid/2,maxv+1))
                best=mid,r=mid-1;
            else
                l=mid+1;
        }
        cout<<best<<endl;
    }
    return 0;
}

在使用 MyBatis 进行数据库操作时,若遇到异常 `org.mybatis.spring.MyBatisSystemException` 和 `com.sf.cwn.ecr.dao.exception.ServiceException`,通常表明在 SQL 执行过程中存在参数绑定错误、SQL 语句语法问题或事务管理异常等情况。 ### 参数绑定错误 当 SQL 语句中引用了未定义的参数名称时,会抛出 `BindingException`,例如错误信息中提到的 `Parameter 'user_type' not found` 或 `Parameter 'name' not found`。这类问题通常发生在以下场景: - 使用 `@Param` 注解时,接口方法参数名称与 SQL 中的 `#{}` 占位符名称不一致。 - 在动态 SQL 中使用 `<if>`、`<choose>` 等标签时,未正确传递参数或参数未被识别。 - 使用 `Map` 传递参数时,未正确设置键值或键名拼写错误。 例如,若接口方法定义为: ```java @Update("UPDATE user SET name = #{name} WHERE id = #{id}") void updateUser(@Param("id") Long id, @Param("name") String name); ``` 则 SQL 中的 `#{name}` 和 `#{id}` 必须与 `@Param` 注解中定义的名称一致[^2]。 ### SQL 语句语法问题 SQL 语句拼接错误也可能导致 `MyBatisSystemException`。例如,在使用 `@Select`、`@Update` 注解时,字符串拼接不当可能导致 SQL 语法错误。如以下示例中,单引号和 `#{}` 的使用方式不正确: ```java @Select("select * from user where name like '%#{name}%' ") List<User> findByLikeName2(@Param("name") String name); ``` 应修改为: ```java @Select("select * from user where name like CONCAT('%', #{name}, '%')") List<User> findByLikeName2(@Param("name") String name); ``` 或使用原生字符串拼接方式: ```java @Select("select * from user where name like '%${name}%'") List<User> findByLikeName2(@Param("name") String name); ``` 但需注意,使用 `${}` 时需防范 SQL 注入风险[^4]。 ### 事务管理异常 `ServiceException` 通常表示业务逻辑层捕获到的异常,可能由事务未正确提交、回滚机制配置不当或数据库连接池资源耗尽等原因引起。检查以下内容: - 是否在更新操作后正确提交事务。 - 是否启用了事务管理器(如 Spring 中的 `@Transactional`)。 - 数据库连接池(如 HikariCP、Druid)是否配置合理,是否存在连接泄漏或超时问题。 ### 解决方案 1. **检查参数绑定**:确保接口方法中 `@Param` 注解与 SQL 中的 `#{}` 名称一致;若使用 `Map`,确保键名正确。 2. **验证 SQL 语法**:使用日志工具(如 Log4j、MyBatis 自带的日志功能)输出实际执行的 SQL 语句,检查是否存在语法错误或拼接问题。 3. **启用事务管理**:在更新操作的方法上添加 `@Transactional` 注解,确保事务正确提交或回滚。 4. **优化连接池配置**:调整最大连接数、超时时间等参数,避免因资源不足导致异常。 ### 示例代码 以下为一个完整的更新操作示例,包含参数绑定和事务管理: ```java @Mapper public interface UserMapper { @Update("UPDATE user SET name = #{name} WHERE id = #{id}") void updateUser(@Param("id") Long id, @Param("name") String name); } @Service public class UserService { @Autowired private UserMapper userMapper; @Transactional public void updateUserName(Long id, String name) { userMapper.updateUser(id, name); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值