poj3276 反轉 開關問題

2022-05-01 18:03:09 字數 1212 閱讀 6317

題目大意:

給你乙個長度為n的字串,包含字母f和b

你可以把區間k(乙個常數)內的所有f變成b,b變成f。

為了把這個字串都變成f,求變化的最小次數和其對應的k的值

分析:《挑戰程式設計競賽》反轉法的例題,(此做法非書上做法)

列舉k,對於每個k,

只要序列最左端的b變成f,然後依次變化,得到答案:

列舉起點然後把k個字母進行變化,這個揭發的時間複雜度是o(n^3),對於5000的資料,顯然tle

首先列舉k是肯定的,

對於每個k,把序列掃一遍得到答案,到達n^2,才可滿足時間要求,所以要思考一下對於區間如何處理

考慮到反轉區間後,區間內部不變的是相鄰元素之間的關係,所以可以另t[n]表示該元素與前面的元素的關係,相同的話就用t[i]=0,否則t[i]=1,

對於區間[a,a+k-1],反轉後變化的是t[a]和t[a+k]

所以對於乙個t[i]=1,只需要改變t[i]和t[i+k]

這樣就可以在o(n)的時間內對乙個k求解

1 #include2 #include3 #include4 #include

5 #include6 #include7 #include

8 #include9 #include10

11#define ll long long

12#define mem(a,b) memset(a,b,sizeof(a))

13#define now t

14const

int maxn=6000;15

intini[maxn];

16char

data[maxn];

17int

t[maxn];

18using

namespace

std;

19int ans=9999999

,k;20

intmain()

2133

for(int k=1;k<=n;k++)

34//

t[i]不會再用到了,不需要再改動了40}

41for(int i=n-k+2;i<=n;i++)//

後面這些元素不夠乙個區間k的數量

4244}45

if(cntk;}46}

47 printf("

%d %d\n

",k,ans);

48 }

poj3276(開關問題)

可算明白了.bbfbfbb 我們到達第三個f,我們需反轉。標記一下在3出反轉了 vis 3 1 對以後的影響是 1.用sum記載影響程度即sum 1 我們到達第四個,雖然是b,但是收到前面影響 sum 1 也就是變成f了。我們需要反轉。標記vis 4 1.sum再 1.即sum 2 也就是第五個會受...

POJ 3276 開關問題

題目鏈結 題目大意 有一些牛,頭要麼朝前要麼朝後,現在要求確定乙個連續反轉牛頭的區間k,使得所有牛都朝前,且反轉次數m盡可能小。解題思路 首先不要看錯題意了,不是求最小k,不要二分。而且反轉區間長度一定是k,小於k是不能反轉的。很明顯得列舉k 1.n 並且有以下反轉思路 從第一頭牛開始,如果朝前,不...

poj 3276 反轉開關問題 一 DP 模擬

sample input 7bb fbfb b sample output 3 3 窮舉肯定是要超時的 2 n個狀態.但是先思考一些規律吧 1 轉動奇數次,必然與初始方向相反 2 轉動偶數次,必然與初始方向相同 列舉k 1 n,得到o n 3 的 這個 會超時,只是模擬而已 tle o n 3 in...