看到資料範圍,就想寫乙個線性複雜度的演算法,一開始我是這樣的:
#includeusing提交後只有50分(資料太水了,竟然拿到了50分)namespace
std;
const
int n=1e5+5
;int
n,a[n],ans,b[n];
intmain()
這種做法顯然是錯誤的,因為它只以1為基準構造了乙個合法序列。例如當序列為
1 5 7 10 14時,如果按照上述做法,合法序列為:1,2,4,7,11 要修改4處。但顯然這裡只要修改一處即可。
於是就想到了正確的演算法雛形:依次以每乙個數為基準,統計修改次數,最後取最小值,就是正解。但顯然這種做法是o(n^2)的,需要優化。
則我們定義
它得到的結果就是a[1]。
我們只需要遍歷一遍原陣列,求出每乙個數的f,如果f相同,則意味著它們對應的a[1]相同,即它們處於同乙個合法序列中。我們只要求出最多的相同的f的個數,就是合法值的個數。答案就是n-cnt.
#includeusingnamespace
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...