• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

yumiym765

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

2025/09/07 练习

L. Bridge Renovation

\(\hspace{20px}\)最近,Monocarp 开始担任他家附近一个公园的园长。公园很大,甚至有一条小河把它分成几个区域。河上建有几座桥。其中有三座桥特别老旧,需要修理。

\(\hspace{20px}\)三座桥的长度相同,但宽度不同。它们的宽度分别为 \(18\) 、 \(21\) 和 \(25\) 个单位。

\(\hspace{20px}\)在公园翻新过程中,Monocarp 必须用新的木板替换作为桥面的旧木板。

\(\hspace{20px}\)木板的标准长度为 \(60\) 个单位。Monocarp 已经知道每座桥需要 \(n(1 \le n \le1000)\) 块木板。但由于桥的宽度不同,第一座桥需要长度为 \(18\) 的 \(n\) 块木板,第二座桥需要长度为 \(21\) 的 \(n\) 块木板,最后一座桥需要长度为 \(25\) 的 \(n\) 块木板。

\(\hspace{20px}\)负责翻修的工人可以将木板切割成若干部分,但拒绝将木板连接起来,因为这样会造成薄弱点,而且看起来很难看。

\(\hspace{20px}\)Monocarp 想买尽可能少的木板,但却苦于计算所需木板的数量。您能帮助他吗?

\(\hspace{20px}\)Link

贪心

首先对于 \(25\),发现 \(25 + 25\) 最合适,一共需要 \(\lfloor \frac{n}{2} \rfloor\) 块,如果 \(n\) 为奇数,则剩下一块。

其次对于 \(21\),发现 \(21 + 21 + 18\) 最合适,一共需要 \(\lfloor \frac{n}{2} \rfloor\) 块,如果 \(n\) 为奇数,则剩下一块。

我们可以将奇数剩下的 \(25\) 和 \(21\) 拼在一起,那么 \(25\) 和 \(21\) 就一共需要 \(n\) 块。

接着对于 \(18\),剩下 \(n - \lfloor \frac{n}{2} \rfloor = \lceil \frac{n}{2} \rceil\) 块,发现 \(18 + 18 + 18\) 最合适,一共需要 \(\lceil \frac{\lceil \frac{n}{2} \rceil}{3} \rceil\) 块,也就是 \(\lceil \frac{n}{6} \rceil\) 块。

最终答案:\(n + \lceil \frac{n}{6} \rceil\)。

点击查看代码
void solve(){
    int n;
    cin >> n;
    int ans = (n + 5) / 6 + n;
    cout << ans << "\n";
}

---------------------- 分割线 ----------------------

C. Sakurako's Field Trip

\(\hspace{20px}\)定义干扰度为满足 \(a_j = a_{j + 1}\) 的 \(j\) ( \(1 \le j < n\) )的个数。

\(\hspace{20px}\)你可以执行任意次数的交换:选择索引 \(i\) ( \(1\le i\le n\) ),交换 \(a_i\) 和 \(a_{n-i+1}\)。

\(\hspace{20px}\)你的任务是确定通过多次执行上述操作所能达到的最小干扰度。

\(\hspace{20px}\)Link

对于 \(i\) 位置的数,影响答案的只有 \(n-i+1\) 和 \(i-1\) 和 \(n-i+2\) 位置的数。

考虑如下顺序 \([a_{i-1},a_{i},a_{n-i+1},a_{n-i+2}]\):

  • \([A,x,y,A]\) 或 \([x,A,A,y]\),交换答案不变。
  • \([A,A,y,B]\),如果 \(y \neq A\),交换会使答案增加,否则交换答案不变。

所以,如果 \(a_{i-1}=a_{i}\) 或 \(a_{n-i+1}=a_{n-i+2}\),那么交换元素 \(a_{i}\) 与 \(a_{n-i+1}\) 要么答案不变,要么答案增加。所以我们从中间往外判断是否交换,最后在统计答案即可。

点击查看代码
void solve(){
    int n;
    cin >> n;
    vector<int> a(n + 1);
    for(int i = 1;i <= n;i++){
        cin >> a[i];
    }
    for(int i = n / 2 + 1;i <= n;i++){
        if(a[i] == a[i - 1] || a[n - i + 1] == a[n - i + 2]){
            swap(a[i], a[n - i + 1]);
        }
    }
    int ans = 0;
    for(int i = 2;i <= n;i++){
        if(a[i] == a[i - 1]){
            ans++;
        }
    }
    cout << ans << "\n";
}

posted on 2025-09-08 10:47  羊毛corn  阅读(10)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3