多校前四版刷題

2021-06-18 04:19:15 字數 3722 閱讀 3493

b -deque

題意:給你乙個序列,和乙個可以往兩邊放的佇列,要求按輸入順序把序列中的數放到佇列中去,可以拿出佇列中的元素,問最後使得在佇列中的元素是非遞減序列的最長長度是多少

思路:這相當於求最長上公升子串行(非遞減),由於佇列兩端都可以放,則相當於拿到乙個數,就以這個數為開始的最長非遞減子串行+以它為開始的最長非遞增子串行-兩者的重複個數

不管怎樣,手動模擬還是硬道理。。。上次多校賽後就模擬的很順利,以為懂了,昨天又做了這道題,我發現自己又有點迷糊了,之前不知道為什麼從後面模擬,昨天想了好久(乙個晚上),。。似乎久了點。。。發現原來從後面回來到達中間的某乙個數時,就直接可以求以這個點為開始的最長非遞減子串行和以它為開始的最長非遞增子串行,因為題目要求是按順序(從前往後的)放佇列的。。。。神題。。

**:

#include #include #include #include #include #include #include #include using namespace std;

const int m=100005;

int down[m];

int up[m];

int cf1[m],cf2[m];

int a[m];

int bin1(int key,int l,int r)

return l;

}int bin2(int key,int l,int r)

return l;

}int main()

printf("%d\n",mmax);

}return 0;

}

d - i-number

題意:給出乙個數x,求乙個最小的y>x並且y%10==0

題比較簡單,不過重新做的時候還是wa了,注意細節!

**:

#include #include #include #include #include #include #include #includeusing namespace std;

const int m=100005;

char a[m];

int s[m];

int main()

int sum;

doreturn 0;

}

h - palindrome sub-array

題意:從乙個n*m的矩陣中選乙個p*p的正方形,使得正方形裡的每一行每一列都是回文

這題之前使勁的在紙上計算,花了很長時間,我可以說這次的速度還可以,不過wa了,可鬱悶了,後面找了好久,才發現錯誤,又長知識了~~

#include #include #include #include #include #include #include #include using namespace std;

const int m=100005;

int a[350][350];

bool panduan(int x,int y,int len)

}if(ff==1)break;

}if(ff==1)break;

}printf("%d\n",l);

}return 0;

}

i -warm up 2

題意:有這樣放的多骨諾牌,垂直放和豎著放的,相同方向的不會相交,只有水平和垂直方向的牌會相交,問最少去掉幾個牌使得剩下的牌互不相交

思路:把那些相交的牌連成邊,然後進行二分匹配,結果就是所有牌個數減去最大匹配數

說心裡話,我不太明白為什麼減去最大匹配數就是答案,我只是一直記得這個結論,,額。。。就敲**了

判斷相交的時候要小心點,不然。。。我至少在紙上畫了好久,原來就這麼簡單

如:(x1,y1)(x1+1,y1)

(x2,y2)   (x2,y2+1)

其實分別把上下兩個點組合判斷即可!!

**:

#include #include #include #include #include #include #include #include using namespace std;

const int m=1010;

struct node

a[2*m];

int mark[m][m];

bool panduan(int i,int j)

int link[2*m],vis[2*m],n,m;

bool dfs(int u)}}

return false;

}int main()}}

int ss=0;

memset(link,-1,sizeof(link));

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

printf("%d\n",n+m-ss);

}return 0;

}

j - the unsolvable problem

題目太坑人了。。。到現在我又被坑了一次

題意:要求a+b=n並且a*b的最大公約數最大(我理解成了a b的最小公倍數最大時max(a,b),wa了!

思路:要使公倍數最大,最好方案是盡量使a b 互質,並且a+b==n所以a b 相差不大  ====》所以從中間找!

**:

#include #include #include #include #include #include #include #include using namespace std;

const int m=100005;

int main()

if(n%2==0)//直接寫ll不行

else

printf("%i64d\n",s);

}return 0;

}

n - group

題意:分組,相鄰標號的是朋友,每一組的value=k*k, k為每組的人數,問怎樣分組才能使總的value值最大,輸出分了幾組

思路:首先考慮樹狀陣列求解,採用離線演算法。根據value 的定義,發現只要一組內的人數越多value值就更大,所以我們把方向放到組內人數上,要使一組內人數更多,就相當於分的組越少,也就是能分一組的盡量分一組,因此,把編號相鄰的都編為一組

首先每次拿到乙個人的編號,就更新(+1),然後再在前面找與它相鄰的編號是否存在,若存在,找到相鄰數的位置進行更新(-1)

**:

#include #include #include #include #include #include #include #include using namespace std;

const int m=100005;

int n,m;

int c[m],a[m],ans[m];

int pos[2*m];

struct node

inv[m];

bool cmp(node a,node b)

int main()

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

sort(inv+1,inv+m+1,cmp);

memset(c,0,sizeof(c));

int j=1;

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

}int main()

}if(a[n][m]==1)printf("alice\n");

else

printf("bob\n");

} return 0;

}

c primer大綱(第四版)

第1章 快速入門 第一部分 基本語言 第2章 變數和基本型別 第3章 標準庫型別 第4章 陣列和指標 第5章 表示式 第6章 語句 第7章 函式 第8章 標準io庫 第二部分 容器和演算法 第9章 順序容器 第10章 關聯容器 第11章 泛型演算法 第三部分 類和資料抽象 第12章 類 第13章 複...

c prime重學(四)基於第四版

迭代器 1 插入迭代器 這類迭代器與容器繫結在一起,實現在容器中插入元素的功能 2 iostream迭代器 這類迭代器可與輸入或輸出流繫結在一起,用於迭代遍歷所關聯的io流。3 反向迭代器 這類迭代器事項向後遍歷。而不是向前遍歷。所有容器型別都定義了自己的 reverse iterator型別,由r...

牛客多校2018四 A

很顯然地發現對於某個位置的乙個1或2,它對答案的貢獻與之前進行了多少秒有關,所以趕緊打個表看一看,就發現對於某乙個1來說,它對答案的貢獻就是 t 2 2 t是之前經過的時間,對於2的情況,打出假設輸入的數列是 2 02 002 0002 的表,就發現答案分別是3,9,21,45,93 對這個答案數列...