題目描述
乙個神秘的村莊裡有4家美食店。這四家店分別有a,b,c,d種不同的美食。lyk想在每一家店都吃其中一種美食。每種美食需要吃的時間可能是不一樣的。現在給定第1家店a種不同的美食所需要吃的時間a1,a2,…,aa。給定第2家店b種不同的美食所需要吃的時間b1,b2,…,bb。以及c和d。lyk擁有n個時間,問它有幾種吃的方案。
資料範圍
1<=n<=100000000,1<=a,b,c,d<=5000,0<=ai,bi,ci,di<=100000000。
此題空間足夠大,時間2s。
ps.不要在意複雜度,事實證明o(n)能過。
題解:
①時間複雜度能夠承受:50002,因此考慮暴力先講ab cd兩組的組合結果求出來。
②對於得到的兩個陣列進行組合,首先肯定要排序。
③排序使用桶排序o(n)。然後維護兩個指標,乙個在1陣列開頭,乙個在2陣列結尾。
④根據單調性,兩個指標只會向相反方向移動,時間複雜度o(n)
#include #include #include #include #include #include #include using namespace std;
int f[100000005],c[25000005],cc[25000005];
int a,b,c,d,n,a[5005],b[5005],aa[5005],bb[5005],max,cnt,cntt,i,j,now;
long long ans;
int main()
for (i=0; i<=max; i++)
while (f[i])
for (i=1; i<=c; i++) scanf("%d",&aa[i]);
for (i=1; i<=d; i++) scanf("%d",&bb[i]);
max=0;
for (i=1; i<=c; i++)
for (j=1; j<=d; j++)
if (aa[i]+bb[j]<=n)
for (i=0; i<=max; i++)
while (f[i])
for (i=cntt; i>=1; i--) if (c[1]+cc[i]<=n) break;
now=i;
for (i=1; i<=cnt; i++)
cout<終點其實是被徹底忘記,旅程不過是場善意的燭骨銘心。
你可曾記得我的孤寂,我們早已在起點各奔東西······ ——————汪峰《地心》
CZY選講 棋盤迷宮
題目描述 乙個n m的棋盤,表示可以通過,表示不能通過,給出q個詢問,給定起點和終點,判斷兩點是否聯通,如聯通輸出 yes 否則輸出 no 資料範圍 n,m 500,q 10 6。題解 由於存在兩個方向和不可逆性,標記聯通分量的方法不可行 分治演算法。按照行將棋盤一分為二,進行dp處理 用f i j...
CZY選講 黑白染色
題目描述 給出平面上n 個點,試將他們黑白染色,要求染色後無法用一條直線把黑白完全分開。隨便輸出一種方案。資料範圍 n 100000 題解 點數很多,但是可以發現至多需要4個點就可以完成。根據上述結論進行分類討論即可 找三個點,若三點共線,則按圖1方法染色。若三點不共線,再找第四個點,若與其中兩點共...
CZY選講 最大子矩陣和
題目描述 有乙個n m的矩陣,恰好改變其中乙個數變成給定的常數p,使得改變後的這個矩陣的最大子矩陣最大。資料範圍 n,m 300。題解 如果沒有p,那麼二維矩陣和就是一維最長連續子串行的dp公升級就可以了 設f i j k 表示在i行j行之間1 k列這乙個矩形中的最大子矩陣的值 轉移方程 f i j...