poj3276(開關問題)

2021-08-13 06:43:08 字數 977 閱讀 3322

可算明白了..

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...