可算明白了..
bbfbfbb
我們到達第三個f,我們需反轉。標記一下在3出反轉了(vis[3]=1). 對以後的影響是+1.,用sum記載影響程度即sum=1;
我們到達第四個,雖然是b,但是收到前面影響(sum==1),也就是變成f了。我們需要反轉。標記vis[4]=1. ,sum再+1.即sum=2;
也就是第五個會受到sum=2個影響。以此類推。 不過到達第i個時,第i個不會受到超出k的反轉的影響。所以說if(i-k+1>0) sum-=vis[i-k+1]. 這個vis不是0就是1,這樣來控制sum。
到了最後一組了,就沒辦法翻轉了,如果剩餘的是正的,那就繼續往下週。如果不是正的,就不要翻轉了,而是直接輸出-1.
#include
#include
#include
using
namespace
std;
const
intmaxn = 5000 + 5;
intdir[maxn], n, f[maxn];
//f[i]=1:面向後方 f[i]=0面向前方
intcompute(
intk)
//計算連續反轉k頭牛需要幾次操作?
sum += f[i];
if(i-k+1 >= 0) sum -= f[i-k+1];
} for
(int
i = n-k+1; i < n; i++)
return
res;
} int
main()
intans_k = 1, ans_cnt = n;
for(
intk = 1; k <= n; k++)
} printf("%d %d\n"
, ans_k, ans_cnt);
} return
0; }
POJ 3276 開關問題
題目鏈結 題目大意 有一些牛,頭要麼朝前要麼朝後,現在要求確定乙個連續反轉牛頭的區間k,使得所有牛都朝前,且反轉次數m盡可能小。解題思路 首先不要看錯題意了,不是求最小k,不要二分。而且反轉區間長度一定是k,小於k是不能反轉的。很明顯得列舉k 1.n 並且有以下反轉思路 從第一頭牛開始,如果朝前,不...
poj3276 反轉 開關問題
題目大意 給你乙個長度為n的字串,包含字母f和b 你可以把區間k 乙個常數 內的所有f變成b,b變成f。為了把這個字串都變成f,求變化的最小次數和其對應的k的值 分析 挑戰程式設計競賽 反轉法的例題,此做法非書上做法 列舉k,對於每個k,只要序列最左端的b變成f,然後依次變化,得到答案 列舉起點然後...
POJ 3276 (一維開關問題)
現在有 n 個牛站一排,給你每個牛的方向。你現在每次只能反轉連續 k 個牛的方向,問把所有牛反轉到面向前方 所需要的最少操作次數 m,以及 k的值。每次反轉乙個區間後,如果左端的牛方向真確,我們便不去考慮這個牛了。故從左到右掃一邊即可,列舉k的值,整個複雜度 o n2 include include...