ZCMU—1946
1946: Who is stupid?
Time Limit:?1 Sec?? Memory Limit:?128 MBSubmit:?4?? Solved:?1
[ Submit][ Status][ Web Board]
Description
xh 和 hx 經常互相嘲笑對方智商低而打架,cc為了讓hx和xh和諧的變成好基友,cc要操作使得hx 和xh的智商變成一樣。
題目給出hx和xh的智商x,y(0<=x, y<=1e9) , cc每一次操作都能改變hx的智商,cc的神奇的操作有3個選擇
1.增加一點hx的智商
2.減少hx的智商 z點 (下一次操作cc就可以減少2*z點智商,若上一次cc增加了一點hx的智商或者選擇休息,則這次只能減少1點,第一次操作也只能減少1點智商)
3.休息(休息也算一種操作)
cc想知道做少操作幾次才能使hx和xh變成好基友?
Input
輸入包含T組數據(1 <= T <= 300000)
每組數據包含x,y
Output
輸出最小的操作次數
Sample Input
2 1 5 7 3Sample Output
4 4HINT
智商不能小于0
【分析】
對智商x,y可以考慮,當x<=y時只能進行+1操作,所以ans=y-x; 否則就要考慮如何減,稍微考慮一下可以發現,肯定是一次性減,減到x<=y,那么答案就是進行減智商的步數t+y-x;但是有可能是減到最靠近y的但是比y大的那個數,然后停一步,接著從1開始減,然后減到x<=y,答案如上, 類推,也就是可能需要多次連續的減智商,再+1補回來。 所以只要去搜一下減的次數就可以了,另外考慮一點,因為如果要打斷連續的減智商,需要一部休息(stop),但是這一步stop用來做之后需要的y-x步的+1操作也是可以的,所以記錄一下stop,在之后考慮+1操作的時候先用stop次數去補。別的問題不大...記得10^9需要考慮long long 防止(1<<t)炸掉 【代碼】 #include <cstdio> #include <iostream> #include <algorithm> #include <cmath> using namespace std; long long x,y; long long dfs(long long now,long long deep,long long stop) {if (now==y) return deep;long long t=0;while (now-(1<<t)+1>y) t++;if (now-(1<<t)+1==y) return deep+t;long long ans=y-max(0LL,now-(1<<t)+1);ans=deep+t+max(0LL,ans-stop);ans=min(ans,dfs(now-(1<<(t-1))+1,deep+t,stop+1));return ans; }int main() {int pp;scanf("%d",&pp);while (pp--){scanf("%lld%lld",&x,&y);if (x<=y)printf("%lld\n",y-x);else printf("%lld\n",dfs(x,0,0));}return 0; }
總結
- 上一篇: 支付宝小程序计时器
- 下一篇: 2021年江苏制造业百强企业排行榜:24