美團筆試覆盤

2021-10-04 03:59:38 字數 3293 閱讀 9483

啥也不說了,菜就得挨打。

給定乙個陣列a[i],長度為n<=1e5,你必須在其中刪除乙個數,使得最長連續上公升子串行最長。問你最長多長。

dp[i][0]表示i-1之前都沒有刪除的以i為結尾的最長上公升子串的長度,dp[i][1]表示i-1之前已經刪除過的以i為結尾的最長上公升子串的長度。(比賽種我用的是dp[i][1]表示在i點刪除,dp[i][2]表示在i之前刪除,這樣也可以,但是轉移比較麻煩,還是上面這種寫法最方便)。

然後遞推的時候注意,如果刪除了i-1,你必須與i-2這個狀態進行比較,就是考慮a[i]和a[i-2]的大小關係,具體看**

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

const int maxn=1e5+10;

int a[maxn];

int dp[maxn][2];

const int inf=0x3f3f3f3f;

signed main()

dp[1][1]=0;

dp[1][0]=1;

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

else

else

} }int ans=0;

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

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

return 0;

}

給定n個任務,每個任務有k個子任務,每個大大任務的k個子任務耗時都是一定的,每完成乙個子任務,得到p的分,如果完成了乙個大任務的所有小任務,得到p*k+q的分,現在你有m的時間,問你最多能得到多少分?

m<=2e9,每個子任務t<=1e6,n,k<=100

直接列舉完成多少個大任務,在完成多少個大任務後,對小任務排序,因為我不會再完成新的大任務了,所以我肯定是先將剩下的大任務中耗時最小的小任務都完成,然後去完成第二小的,然後第三小.......這樣小任務就可以貪心解決了

#include #include #include #include #define int long long 

using namespace std;

const int maxn=100+10;

int cost[maxn];

signed main()

sort(cost+1,cost+n+1);

int p,q;

scanf("%lld%lld",&p,&q);

int cnt=min(n,m/sum);

if(cnt>=n)

int ans=0;

for(int i=0;i<=cnt;i++)

else

}if(!temp)break;

} ans=max(ans,cur);

} printf("%lld\n",ans);

return 0;

}

給定乙個無向圖,現在你從點s出發,向其他點跑,路徑一定選擇最短路,問你一共跑k公尺,到達的點數的個數是多少?注意在路中間停下來也算點的個數。

n<=1e5,m<=1e5.

直接dijkstra求出s到每個點的最短路的距離,然後你只需要思考乙個問題:如果沒有點恰好為k,那是不是所有的點都在邊上?這時候直接統計;如果有點的距離恰好為k,那是否會引起計數的重複?如果你記錄邊的話,計數是絕對會重複的,所以再加乙個重複個數的計數即可。

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

const int maxn=1e5+10;

int dis[maxn];

struct heapnode

bool operator < (const heapnode &rhs)const

};int vis[maxn];

struct edge

};vectorg[maxn];

vectoredges;

void add_edges(int u,int v,int cost)

const int inf=1e9;

int n,m,k;

void dijkstra(int s)}}

}}signed main()

scanf("%d",&k);

dijkstra(s);

int ans=0;

int cnt=0;

for(int u=1;u<=n;u++)}}

printf("%d\n",ans-cnt/2);

return 0;}/*

3 3 1

1 2 2

2 3 3

1 3 4

4*/

給定乙個01陣列,現在支援兩種操作

1.將整個區間01翻轉

2.詢問整個大區間的最長不遞減子串行長度。

經典線段樹維護最長遞增子串行,考爛的題目,然而沒有時間看。。。

線段樹維護左邊區間開頭0的個數,右邊區間開頭0的個數,區間0的個數與1的個數。

然後只需要考慮合併時的貢獻,可以參考一下hdu6404這個題,把高低看成0和1,就是這個題了,合併很簡單的。

#includeusing namespace std;

#define all(a) a.begin(),a.end()

int n,m;

const int maxn=1e5+10;

int a[maxn];

struct nodet[maxn<<2];

void build(int u,int l,int r)

else

return;

} int mid=(l+r)/2;

build(u<<1,l,mid);

build(u<<1|1,mid+1,r);

t[u].l0=max(t[u<<1].a0+t[u<<1|1].l0,t[u<<1].l0+t[u<<1|1].a1);

t[u].a0=t[u<<1].a0+t[u<<1|1].a0;

t[u].r0=max(t[u<<1|1].a0+t[u<<1].r0,t[u<<1|1].r0+t[u<<1].a1);

t[u].a1=t[u<<1|1].a1+t[u<<1].a1;

}int solve()

signed main()

build(1,1,n);

while(m--)

} return 0;}/*

5 510011

qc 1 5

qc 1 3

q*/

覆盤美團的筆試

正文 剛做完。四道程式設計題,一道測試題。程式設計題,還是全裸,完全自己寫 他有好多迷糊人的語言描述,擼出本質就是 1 給乙個衣服搭配,讓算最大效益。主要點在不同衣服的邏輯搭配和單件衣服個數的邏輯組合。2 小美書架借書問題,考察點在自定義輸入和輸出上邊,邏輯上是簡單的if判斷,然後將結果存入到定義好...

DTKJ筆試覆盤

10道選擇,2道程式設計 以下 的結果為 char archars hello autel char pchars archars cout下列 中test的建構函式和析構函式分別執行了幾次?test ptestarray new test 2 delete ptestarray 答 建構函式執行了...

美團筆試2018 9 10

第一題 無向圖 def min path n,b node list 0 n 1 儲存節點的距離 for path in b 遍歷路徑,使後一節點距離值等於前一節點距離值加一 x,y path node list y node list x 1 depth 0 找到最大深度 for i in ran...