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";
}
浙公网安备 33010602011771号