[蓝桥杯][2017年第八届真题]对局匹配
生活随笔
收集整理的這篇文章主要介紹了
[蓝桥杯][2017年第八届真题]对局匹配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
小明喜歡在一個圍棋網站上找別人在線對弈。這個網站上所有注冊用戶都有一個積分,代表他的圍棋水平。
小明發現網站的自動對局系統在匹配對手時,只會將積分差恰好是K的兩名用戶匹配在一起。如果兩人分差小于或大于K,系統都不會將他們匹配。
現在小明知道這個網站總共有N名用戶,以及他們的積分分別是A1, A2, … AN。
小明想了解最多可能有多少名用戶同時在線尋找對手,但是系統卻一場對局都匹配不起來(任意兩名用戶積分差不等于K)?
題解:
我們可以按照要求將分數分成不同組,同組內的數據相鄰元素差值為k。例如樣例2
10 1 2 1 1 1 1 4 4 3 4 4我們可以分出一組(1,2,3,4)
這樣的目的是為了便于選取,因為相鄰元素差值為k,所以我們就可以進行跳躍式選取,也就是如果當前決定第i位的值,我們可以選擇選取第i位,這樣就從第i-2位的情況加上第i位的情況,也可以不選,這樣答案就是繼承第i-1位,那當前,這樣就成了dp問題
dp(i)=max{dp(i?1),dp(i?2)+ai}
我們將原數據可以分為好幾組,求出每組的最大值,然后最后累加即可
這是一個很巧妙的思維,可以慢慢理解
代碼:
/* 10 2 2 1 1 1 1 4 4 3 4 4 0 2 4 1 3 */ #include<bits/stdc++.h> using namespace std; const int maxn=1e5+8; const int MAX=100000; int cnt[maxn]; int val[maxn]; int dp[maxn]; int main(){int n,k;cin>>n>>k;int ans=0;for(int i=1;i<=n;i++){int x;cin>>x;cnt[x]++;}if(k==0){for(int i=0;i<=MAX;i++){if(cnt[i])ans++;}}else {for(int i=0;i<k;i++){int sum=0;for(int j=i;j<=MAX;j+=k){val[sum++]=cnt[j];}dp[0]=val[0];dp[1]=max(val[1],dp[0]);for(int j=2;j<sum;j++){dp[j]=max(dp[j-2]+val[j],dp[j-1]);}ans+=dp[sum-1];}}cout<<ans<<endl;return 0; }總結
以上是生活随笔為你收集整理的[蓝桥杯][2017年第八届真题]对局匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arrive的过去式 arrive的过去
- 下一篇: 腐草为萤的意思 腐草为萤含义介绍