2020.5.7普及C組 移動奶牛(herding)【紀中】【數學】

比賽時50分.
當時的想法就是
對於最小: 類似於二分,分成兩半,取小的那一半繼續分,記錄次數
對於最大: 直接輸出大的那一邊1-1
有一個特判就是
如果x+1==yx+1==y就直接在yzy-z處理。
如果y+1==zy+1==z就直接在xyx-y處理。


事實證明,我想的太複雜了(對於最小)

除去010,1的情況,其實我們只需要輸出22就行了
Why?
因爲可以我們直接將結尾端點放到開頭端點+2的地方,這樣就演變成了11的情況,1+1=21+1=2

在這裏插入圖片描述
AC CodeAC~Code

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int x,y,z,xy,yz;
int main()
{
    freopen("herding.in","r",stdin);
	freopen("herding.out","w",stdout);
    cin>>x>>y>>z;
    if(x+1==y&&y+1==z)  //0的情況
      cout<<0<<endl;
    else if(x+2==y||y+2==z) //1的情況
      cout<<1<<endl;
    else   //2的情況
	  cout<<2<<endl;
	xy=y-x,yz=z-y;   //求最大,一位一位挪,所以是最大區間-1
	if(xy>yz)
	  cout<<xy-1;
	else
	  cout<<yz-1;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章