這道題做個今天的結尾
比較簡單
正在備戰csp嗎,正好刷一下
難度:簡單 |
時/空限制:1s / 256MB |
總通過數:1738 |
總嘗試數:2584 |
來源: CSP-J 2022 模擬賽 |
原題鏈接
4579. 相遇問題 - AcWing題庫
題目描述
一個無限長的樓梯上站著兩個人,其中一個人在第?a?級臺階上,另一個人在第?b?級臺階上。
兩個人都可以自由的上下移動,每人每次可以向上或向下移動一級臺階。
每個人的每次移動都要消耗體力,具體為:
對于同一個人來說,其第?11次移動消耗的體力為?1,第?2?次移動消耗的體力為 2,第?3?次移動消耗的體力為?3,以此類推。
例如,如果一個人先向上移動一級臺階,再向下移動一級臺階,最后再次向上移動一級臺階,那么他消耗的總體力值為?1+2+3=6。
兩個人想要通過合理移動,使得他們能夠在同一級臺階上相遇,并且相遇時,兩人消耗的總體力值之和盡可能小。
請你計算,兩人消耗的總體力值之和的最小可能值。
輸入格式
第一行包含一個整數?a。
第二行包含一個整數?b。
輸出格式
一個整數,表示兩人消耗的總體力值之和的最小可能值。
數據范圍
所有測試點滿足,1≤a,b≤1000,a≠b。
輸入樣例1:
3
4
輸出樣例1:
1
樣例1解釋
在本樣例中,讓第一個人上一級臺階或第二個人下一級臺階均可,消耗總體力為?1。
輸入樣例2:
101
99
輸出樣例2:
2
樣例2解釋
在本樣例中,讓第一個人下一級臺階,同時讓第二個人上一級臺階即可,消耗總體力為?1+1=2。
輸入樣例3:
5
10
輸出樣例3:
9
樣例3解釋
在本樣例中,一種最佳方案為讓第一個人上兩級臺階,同時讓第二個人下三級臺階,消耗總體力為?1+2+1+2+3=9。
要解決這個問題,我們需要讓兩個站在不同臺階上的人通過移動相遇,并且使他們消耗的總體力值之和最小。
首先分析問題的關鍵特點:
兩人初始位置分別在第 a 級和第 b 級臺階
每次移動消耗的體力值等于移動次數(第 1 次 1 點,第 2 次 2 點,依此類推)
目標是找到最佳相遇點,使總消耗體力最小
解題思路
首先計算兩人初始位置的距離 d = |a - b|
當 d = 1 時,只需其中一人移動 1 步,總消耗為 1
當 d > 1 時,最優策略是讓兩人向中間位置移動:
距離較近的人移動 k 步
距離較遠的人移動 d-k 步
為使總消耗最小,應讓兩人的移動次數盡可能均衡
首先,我代碼的思路是:
1.確保 a < b
2.當兩人相鄰時直接返回 1
3.計算中間點 c = (a+b)/2
4.計算 a 到 c-1 的體力消耗
5.計算 c+1 到 b 的體力消耗
6.輸出總消耗
下面是我的代碼
#include <bits/stdc++.h>
using namespace std;int main(){int a,b;cin>>a>>b;if(a>b){swap(a,b);}if(b-a==1){cout<<"1"<<endl;return 0;//特判}int s=0,c=(a+b)/2,ans=0;for(int i=a; i<=c-1; i++) ans++, s+=ans;ans=0;//清空for(int i=c+1; i<=b; i++) ans++, s+=ans;cout<<s;return 0;
}