YbtOj練習 貪心4 修改序列

2022-05-08 15:51:10 字數 861 閱讀 8654

看到資料範圍,就想寫乙個線性複雜度的演算法,一開始我是這樣的:

#includeusing

namespace

std;

const

int n=1e5+5

;int

n,a[n],ans,b[n];

intmain()

提交後只有50分(資料太水了,竟然拿到了50分)

這種做法顯然是錯誤的,因為它只以1為基準構造了乙個合法序列。例如當序列為

1 5 7 10 14時,如果按照上述做法,合法序列為:1,2,4,7,11 要修改4處。但顯然這裡只要修改一處即可。

於是就想到了正確的演算法雛形:依次以每乙個數為基準,統計修改次數,最後取最小值,就是正解。但顯然這種做法是o(n^2)的,需要優化。

則我們定義

它得到的結果就是a[1]。

我們只需要遍歷一遍原陣列,求出每乙個數的f,如果f相同,則意味著它們對應的a[1]相同,即它們處於同乙個合法序列中。我們只要求出最多的相同的f的個數,就是合法值的個數。答案就是n-cnt.

#includeusing

namespace

std;

const

int n=1e5+5

;int

n,a[n],f[n];

intmain()

sort(f+1,f+n+1

);

int len=1,ans=0

;

for(int i=2;i<=n;i++)

else len++;

}ans=max(ans,len);

cout

return0;

}

YbtOj練習 貪心3 最優密碼

這道題暴力拿了90分,正解實在不會寫!因為字串不好操作,所以乾脆把它變成乙個int的陣列,最後輸出時直接把數字轉換成字元輸出。首先考慮我們的貪心策略 下標從1開始 設k為我們已經處理過的位置的個數,初始時k 0。只要我們的操作次數還有剩餘,那麼就考慮第k 1個位置能通過交換操作得到的最小的數字是多少...

YbtOj練習 貪心 1最大積分

這道題的題意描述有問題。問題很大,導致我wa了無數次。如果看這句話很容易就會理解錯。在我wa了n次之後看到了這兩個字,哦豁,原來這裡的意思是當你在第i級時,如果買的總件數達到了t i 那麼就可以公升級。includeusing namespace std typedef unsigned long ...

演算法練習題4 最長連續序列

力扣 128.最長連續序列 分析 這道題稍微有些難度,雖然一開始也想到了要使用map,但是沒有答案中使用的那麼靈活。這道題的思路是,先遍歷以便陣列,使用set記錄資料並去重 然後再遍歷一遍陣列,這次遍歷中,尋找連續數列的最小起始點,然後計數。更困難的是,最長不連續,該如何實現呢?class solu...