題目:大意是說 Valentine在想要去看電影,總共n場電影,每場電影都有一個對應的genre值x (1?<=x?<=k),但是 Valentine不想把所有的電影都看完,他想把其中某些genre值=x的電影去掉,只看剩下的電影,但是還有一個問題:就是每場電影的時間是固定的,所以他必須按順序來觀看,當上一場電影的genre值與下一場的genre值不一樣的時候,
Valentine的憤怒值就會+1(初始為0),題目要求出去掉genre值為x的電影後,他的憤怒值最小的x。
方法:仔細想了一下之後會發現,需要使用暴力把1-K之間的值遍歷一下,求出所有的憤怒值,但是數據量太大,這樣肯定會超時,所以就觀察一下,如果不去掉任何電影,那麼假設他的憤怒值為Y,去掉後為y,那麼就是讓我們求Y-y的值最大的那個x。讓我們來看一個例子:1 3 2,假設要去掉的x=3,根據題目的描述,去掉3後兩邊的電影值還是不同,所以這樣他的總憤怒值Y應該-1,下一個例子:1 3 1,同樣去掉3之後,發現兩邊的電影值相同,那麼他的憤怒值應該-2。這樣我們就了解了這道題的解決方法。
優化:題目中會出現例如:1 3 3 2的例子,也就是去掉3的時候,還要去掉它後面與它值相同的電影,這樣就不如在加載數據的時候把數據直接改為1 3 2,這樣會減少很多麻煩。
代碼:
#include#include #include using namespace std; int main() { int n,k,x,t=1,s[100010],d[100010]; memset(d,0,sizeof(d)); cin>>n>>k; s[0]=0; for(int i=1;i<=n;i++) { cin>>x; if(x!=s[t-1]) s[t++]=x; } s[0]=s[t]=0; for(int i=1;i d[p]) p=i; cout<