ArabellaCPC 2019 J. Thanos Power題解

題目鏈接

題目大意:給一個101e5以內的數字,你要通過兩種操作湊出來;執行兩種操作:一種是加上10x,一種是減去10x.

這個題很容易聯想到01揹包,每一步都可以選擇通過10-k+1做法或者是直接k的做法,簡而言之,9可以通過先加上10,再減去1來實現。

但是這是每一步影響都是下一步,我們可以在每一步都用兩個數值表示上一位是第一個做法實現還是第二個做法實現,這樣就可以完美優化了:

做法如下:

for(int time=0;time<len;time++)
	{//(有用點個讚唄)
		
		int x=a,y=b;
		a=min(x,y)+all[time]-'0';//直接
		if(time==0)b=x+11+'0'-all[time];
		else b=min(x+11+'0'-all[time],y+9+'0'-all[time]);//兩種的+10再減。
		ans=min(a,b);
	}

這裏其實還有個問題,如果是第一種做法實現,即先加10,再慢慢減;會出現一種情況,就是前一個爲也是減出來的,後面一位也是減出來的。後一位需要一個10,前一位正好不用減這個10,留給後面用就行了,這樣前面步數-1,後面因爲有前面留出來的10,步數也-1,也就是說:

b=min(x+11+‘0’-all[time],y+9+‘0’-all[time]);

這個代碼就實現了前一位如果是減操作的話,就會導致少了兩步。

(有用點個讚唄)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章