1. 程式人生 > >藍橋杯-對局匹配 | 分組+線性DP

藍橋杯-對局匹配 | 分組+線性DP

問題描述(題目連結:對局匹配)  小明喜歡在一個圍棋網站上找別人線上對弈。這個網站上所有註冊使用者都有一個積分,代表他的圍棋水平。
  小明發現網站的自動對局系統在匹配對手時,只會將積分差恰好是K的兩名使用者匹配在一起。如果兩人分差小於或大於K,系統都不會將他們匹配。
  現在小明知道這個網站總共有N名使用者,以及他們的積分分別是A1, A2, ... AN。
  小明想了解最多可能有多少名使用者同時線上尋找對手,但是系統卻一場對局都匹配不起來(任意兩名使用者積分差不等於K)?輸入格式  第一行包含兩個個整數N和K。
  第二行包含N個整數A1, A2, ... AN。
  對於30%的資料,1 <= N <= 10
  對於100%的資料,1 <= N <= 100000, 0 <= Ai <= 100000, 0 <= K <= 100000輸出格式
  一個整數,代表答案。樣例輸入10 0
1 4 2 8 5 7 1 4 2 8樣例輸出6

思路 (參考部落格:https://blog.csdn.net/flyawayl/article/details/79068946)

  如果把n個元素按照將分數相差為k的使用者分成一組,例如第一組就是{0,k,2k,3k...},第二組就是{1,k+1,2k+1...},等等。這樣分組的話,每個分組的使用者是不可能和其他分組的使用者匹配成功的,因為分差不可能為k

  這樣的話,只要在每個分組裡面選取儘量多的使用者就可以了。用cnt(i)表示分數為i的使用者人數,假設現在第i組有m個不同分數{x,x+k,x+2k,...,x+
(m1)k}
,其中x表示該組第一個人的積分,那麼用動態規劃法來選擇儘量多的人數。dp(j)表示選擇前j個分數能獲得的最大使用者人數(價值),很明顯如果選擇第j個分數,那麼第j1個分數是不能選的,因為它們的積分相差k,該組最大線上人數為dp(m)


  狀態轉移方程如下:

                                                dp[i] = max( dp[i-1] , dp[i-2]+cnt[score] )

  其中cnt(score)表示積分為第i個分數的總人數。是否感覺上述動態方程與01揹包很類似?
需要注意的是,k=0要特殊處理。

這個題最主要的是解決分組的問題,解決分組之後就能想到用DP的思想求得最大值。

#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std;

const int maxn=1e5+10;
int a[maxn],dp[maxn],cnt[maxn];

int main()
{
    int n,k;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        memset(a,0,sizeof(a));
        int  x;
        for(int i=0; i<n; ++i)
        {
            scanf("%d",&x);
            a[x]++;
        }

        int ans=0,id;
        if(k==0)
        {
            for(int i=0; i<maxn; ++i)
                if(a[i]) ++ans;
        }
        else
        {
            for(int i=0; i<k; ++i)
            {
                id=0;
                for(int j=i; j<maxn; j+=k)
                    cnt[id++]=a[j];

                dp[0]=cnt[0];
                for(int j=0; j<id; ++j)
                {
                    if(j==1) dp[j]=max(dp[j-1],cnt[j]);
                    else
                    {
                        dp[j]=max(dp[j-1],dp[j-2]+cnt[j]);
                    }
                }
                ans+=dp[id-1];
            }
        }
        printf("%d\n",ans);
    }

    return 0;
}

相關推薦

藍橋-對局匹配 | 分組+線性DP

問題描述(題目連結:對局匹配)  小明喜歡在一個圍棋網站上找別人線上對弈。這個網站上所有註冊使用者都有一個積分,代表他的圍棋水平。  小明發現網站的自動對局系統在匹配對手時,只會將積分差恰好是K的兩名使用者匹配在一起。如果兩人分差小於或大於K,系統都不會將他們匹配。  現在小

藍橋 對局匹配

問題描述  小明喜歡在一個圍棋網站上找別人線上對弈。這個網站上所有註冊使用者都有一個積分,代表他的圍棋水平。  小明發現網站的自動對局系統在匹配對手時,只會將積分差恰好是K的兩名使用者匹配在一起。如果兩人分差小於或大於K,系統都不會將他們匹配。  現在小明知道這個網站總共有N

藍橋】運動員分組

運動員分組:     有N個人參加100米短跑比賽。跑道為8條,因此每組人數最多為8。     程式的任務是按照儘量使每組的人數相差最少的原則分組。例如:     N=8時,分成1組即可。     N=

第六屆藍橋九數分組

九陣列分數 1,2,3...9 這九個數字組成一個分數,其值恰好為1/3,如何組法? #include <stdio.h> void test(int x[]) { int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];

藍橋 K好數 (dp)------------C語言

/*問題描述 如果一個自然數N的K進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是K好數。 求L位K進位制數中K好數的數目。例如K = 4,L = 2的時候,所有K好數為11、13、

藍橋 地宮尋寶(DP or DP+記憶化搜索)

搜索 1.7 寫法 str 大眾 include import 行數據 哪些 藍橋杯 地宮尋寶 X 國王有一個地宮寶庫。是 n x m 個格子的矩陣。每個格子放一件寶貝。每個寶貝貼著價值標簽。 地宮的入口在左上角,出口在右下角。 小明被帶到地宮的入口,國王要求他只能向右或

第八屆藍橋決賽 對局匹配

標題:對局匹配 小明喜歡在一個圍棋網站上找別人線上對弈。這個網站上所有註冊使用者都有一個積分,代表他的圍棋水平。 小明發現網站的自動對局系統在匹配對手時,只會將積分差恰好是K的兩名使用者匹配在一起。如果兩人分差小於或大於KK,系統都不會將他們匹配。 現在小

第八屆藍橋決賽試題: 對局匹配

題目: 標題:對局匹配 小明喜歡在一個圍棋網站上找別人線上對弈。這個網站上所有註冊使用者都有一個積分,代表他的圍棋水平。 小明發現網站的自動對局系統在匹配對手時,只會將積分差恰好是K的兩名使用者匹

藍橋 2017 國賽B組C/C++【對局匹配

題意就是給我們一串數  讓我們儘可能地取 約束條件是a[i] 和a[i]+k不能同時出現 所有元素之間相差k的元素都不能同時出現 讓我們求所能取到的最大的數的和是多少分析: dp思路,這個和樹形dp有點相似 就是列舉0~k 然後在每個這個元素上迭代加k 每個元素儲存兩個狀態

藍橋—歷屆試題 對局匹配

問題描述  小明喜歡在一個圍棋網站上找別人線上對弈。這個網站上所有註冊使用者都有一個積分,代表他的圍棋水平。  小明發現網站的自動對局系統在匹配對手時,只會將積分差恰好是K的兩名使用者匹配在一起。如果兩人分差小於或大於K,系統都不會將他們匹配。  現在小明知道這個網站總共有N

17年藍橋本科B組決賽--對局匹配

小明喜歡在一個圍棋網站上找別人線上對弈。這個網站上所有註冊使用者都有一個積分,代表他的圍棋水平。小明發現網站的自動對局系統在匹配對手時,只會將積分差恰好是K的兩名使用者匹配在一起。如果兩人分差小於或大於K,系統都不會將他們匹配。現在小明知道這個網站總共有N名使用者,以及他們的

藍橋 K好數 DP

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

藍橋節點選擇(java)第一道樹形dp分析

藍橋杯 節點選擇 問題描述     有一棵 n 個節點的樹,樹上每個節點都有一個正整數權值。如果一個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少? 輸入格式 第一行包含一個整數 n 。 接下來的一行包含 n 個正整

“東信”廣西大學第一屆程式設計競賽(同步賽)F-出裝方案(二分圖最大匹配/狀壓dp)

題目 思路來源 https://ac.nowcoder.com/acm/contest/view-submission?submissionId=37522548(MCMF做法待補) https://ac.nowcoder.com/acm/contest/view-submi

藍橋 合併石子 DP+四邊形不等式優化

  演算法提高 合併石子   時間限制:2.0s   記憶體限制:256.0MB 問題描述   在一條直線上有n堆石子,每堆有一定的數量,每次可以將兩堆相鄰的石子合併,合併後放在兩堆

藍橋/nyoj 737 合併石子 區間dp+平行四邊形優化

問題描述   在一條直線上有n堆石子,每堆有一定的數量,每次可以將兩堆相鄰的石子合併,合併後放在兩堆的中間位置,合併的費用為兩堆石子的總數。求把所有石子合併成一堆的最小花費。 輸入格式   輸入第一行包含一個整數n,表示石子的堆數。   接下來一行,包含n個整數,按

藍橋 演算法提高 概率計算 (概率DP

  演算法提高 概率計算   時間限制:1.0s   記憶體限制:256.0MB 問題描述   生成n個∈[a,b]的隨機整數,輸出它們的和為x的概率。 輸入格式   一行輸入四個

藍橋ALGO-3 K好數(dp

問題描述 如果一個自然數N的K進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是K好數。求L位K進位制數中K好數的數目。例如K = 4,L = 2的時候,所有K好數為11、13、20、

藍橋-運動員分組

題目 有N個人參加100米短跑比賽。跑道為8條。程式的任務是按照儘量使每組的人數相差最少的原則分組。 例如: N=8時,分成1組即可。 N=9時,分成2組:一組5人,一組4人。 N=25時

藍橋 k好數dp

如果一個自然數N的K進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是K好數。求L位K進位制數中K好數的數目。例如K = 4,L = 2的時候,所有K好數為11、13、20、22、30、31、33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值。