2020 10 18 YC中學模擬賽

2022-08-13 22:09:22 字數 3431 閱讀 4708

2020.10.18:yc中學模擬賽

(難度介於csp-j2~csp-s2)

傳送門

水題,但寫sort人傻了,忘了sort是左閉右開的結構,導致陣列沒排完序 (分數-40)

題意就是將n件物品2個一組,讓求組數最少時,每組價值差盡量小

具體怎麼做呢?

考試的時候,我是一開始想到的是用最小價值的物品和最大價值的物品相加,次小和次大相加,第k小的和第k大的相加,這樣必定每組價值差最小

但如果某兩數之和大於價值上限怎麼辦?

所以進行判斷,單獨取出這兩個數中較大的乙個,獨成一組;而較小的乙個參與與其他數字的合併

這是滿足貪心的思想的

#includeusing namespace std;

int mx;//每組紀念品**之和的上限

int n;//購來的紀念品的總件數

int a[30100];

int ans;

int main()

sort(a,a+n+1);

int l=1,r=n;

while(l<=r)else

}cout順便插一句,sort一類的stl都是左閉右開的結構

左閉右開:一種區間結構

(開區間):區間兩處的端點值取不到

[閉區間]:區間兩處的端點值可以取到

所以,我就是忘了sort是左閉右開的那個人,然後就給下標0~n-1的資料排序,唯獨沒到下標n

sort(a,a+n);

傳送門就是有n個點m條邊,然後看這些點邊構成了多少個集合,最後-1(看需要連多少條邊)就好了

我想的是用並查集來做 (就構建集合,然後查詢,比並查集模板還簡單 )

也沒什麼說的,就將每個點掛到自己的根節點上

最後隨便數一下有多少個根節點就完成

不會並查集的同學請看看這篇文章:【並查集】一種與時間賽跑的巧妙演算法

以及學習並查集請必需掌握的鏈式前向星:關於路徑儲存的常見優化——前向星與鏈式前向星

#includeusing namespace std;

int n,m;//n個城,m條路

int fa[100100];

int find(int i)

else

}int main()

long long ans=0;

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

} ans--;

cout<傳送門

就是一張nm的地圖,為障礙物,求奶牛t步內從[sx,sy]到[ex,ey]的方案數

我最開始打了個dfs搜尋,以為t<=15資料能過

#includeusing namespace std;

int n,m,t;

char a[110][110];

int sx,sy,ex,ey;

int dir[4][2]=,,,};

bool vis[110][110];

int ans;

bool in(int x,int y)

//cout<>n>>m>>t;

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

} cin>>sx>>sy>>ex>>ey;

dfs(sx,sy,0);

cout下來大佬yja告訴我,這樣時間複雜度高達約o(4^k)(4個方向,可以走t步,最壞約為10 ^9)

所以我們進行記憶化

以及,我們還要考慮目前所在的點和終點間的距離(這裡用曼哈頓距離進行估價,即|x1-x2|+|y1-y2|) 是否大於t-走過的步數

(即:|x1-x2|+|y1-y2|<=t-z)

若大於那麼從起點走t次後一定無法到達終點,所以後面一切均為無用功,直接結束本次搜尋(可行性剪枝)

可以用記憶化就可能能用dp

dp有個好處就是可以不進行可行性剪枝

而改用三維陣列,某一維記錄當前步數

在t步內,到達[i,j]方案數為上下左右除去障礙物的和

然後判斷是否越界等基本操作,給f[sx,sy]賦初值=1

f[i][j][k]表示第k時間到達(i,j)的方案數,得到:f[x][y][k]+=f[x+dir[0][i]] [y+dir[1][i]] [k+1]

//dir表方向變化

dp

#includeusing namespace std;

int n,m,t;

int sx,sy,ex,ey;

char a[110][110];

int f[110][110][110];

int dir[4][2]= ,,,};

bool in(int x,int y)

} cin>>sx>>sy>>ex>>ey;

f[sx][sy][0]=1;

for(int i=1; i<=t; i++) }}

}} }

cout傳送門

線段樹,暫時不太懂

略......

考試的時候暴力,a了兩組資料,其他超時

//a兩組資料

#includeusing namespace std;

long long n;

long long a[10100];

long long ans;

int main()

cout<<0

if(y>k)y=k;

if(y>x)

}} cout<

} return 0;

}

YC創業課的總結

上個月,參加了笑來老師組織的yc創業課,第一次通過這樣的20課,課程,看著 他的筆記,我徹底明白了,就是寫下來特別重要,是對自己對思路乙個總結,寫出來後,再把說出來,這樣才能把東西真正的思考出來。讀了很多書,但是發現自己的表達能力,以及說故事的能力確實很差,這就是自己下一步需要去實踐,提高的地方吧。...

2020 10 18 v 常見指令

寫在前面 利用腳手架搭建乙個vue專案,然後開始學習。過程省略 正式內容 現代開發模式 傳統開發模式 代表vue react jquery 特點20 表現層 80 表現層 現代開發模式的代表就是vue react,與傳統開發模式的大部分精力在class和樣式中,vue只有20 的表現層 核心在資料層...

2020 10 18 動態規劃(最長回文子串)

就在這裡記錄一下動態規劃。動態規劃的關鍵點就是小問題和大問題的聯絡。用乙個遞迴表,更容易理解。對於這個題,遞迴函式中,如果i j,必然是回文,如果i j 1,只需要比較這兩個位置的值是否一樣,否則,就需要遞迴比較內部的字串。以abccbd作為例子,最開始是f 0 0 f i j 指s.substri...