HPU 18級個人訓練 11月15日

2021-09-29 16:02:05 字數 1292 閱讀 6359

題意:波浪陣列滿足四個條件:1、至少兩個元素。2、奇數字的數都相等。3、偶數字的數都相等。4、奇數字和偶數字的數不相等。給你乙個陣列(陣列中元素不大於c),你要從中找出波浪陣列的最大長度。(保證波浪陣列是該陣列的一部分就行,就是可以在陣列中任意按順序挑選,使之滿足波浪陣列的條件)

這個題可以用動態規劃(dp)來解。首先了解一下什麼是dp。

首先我們來構造乙個波浪陣列,比如:1 2 1 2 1 2 1 2

很容易就發現當奇數字是1,偶數字是2的時候,波浪陣列的排列一定是1後面是2,2後面是1,再1後面是2,2後面是1...

於是子問題就成了,當1出現的時候我們去找後面的2,並且ans++,當2出現的時候我們去找1,ans++...(因為分開來看,你找的只是波浪陣列中的奇數字和偶數字的數字而已)

那麼,如何來記錄1 2 1 2 1 2 1 2這樣的陣列呢?

可以用乙個二維陣列巧妙地利用這兩個相關的陣列來記錄他們出現的次數。

因為i的後面一定是j,j的後面一定是i.故dp[i][j]=dp[j][i]+1,dp[j][i]=dp[i][j]+1.這個計數方式妙處在於dp[i][j]中i是目前正在遍歷的數字,而j是新增的字尾用來辨認下乙個j來計數的。

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

typedef long long ll;

const int maxn=1e5+7;

int a[maxn];

int dp[105][105];

int main()

for(int i=0;i>b[i];

int ans;

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

return res;

}int main()

if(ans<0) cout<<"-";

ans=abs(ans);

float y=ans/1000.0;

printf("%.3f\n",y); }

return 0;

}

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

const int maxn=1e4+10;

typedef long long ll;

int a[maxn];

ll gcm(ll a,ll b)

int main()

HPU個人訓練3

題目大意 kefa住在編號為1的房子裡,現在kefa要去餐廳,餐廳位於樹的葉子節點,現在給乙個m,如果kefa去餐廳的路徑連續遇到貓的個數大於m,該餐廳kefa就不會過去,1位置上有貓。問kefa可以去的餐廳個數。解題思路 用dfs將圖跑一遍即可,過程中標記連續遇到貓的個數,還有乙個點就是需要判斷該...

個人訓練 1 問題D 卡片

題目描述 你有一疊標號為1到n的卡片。你有一種操作,可以重排列這些卡片,操作如下 1.將卡片分為前半部分和後半部分。2.依次從後半部分,前半部分中各取一張卡片,放到新的序列中。例如,對卡片序列 1,2,3,4,5,6 操作後的結果為 4,1,5,2,6,3 現在你有乙個初始為 1,2,3,n 的卡片...

ECJTU ACM18級隊員寒假訓練賽

a題 題意 將乙個從1到n的數字序列分成2個序列 求出兩個序列之和的絕對值之差的最小值 輸出這個最小值 這道題的意思很明顯如果從1到n加起來為整數的話那麼怎樣都能平分成 2個加起來和相同的序列,如果加起來是奇數,那麼一定存在2個序列他們的和的差為1 includeint main h題 圓桌逆序求n...