藍橋杯-對局匹配 | 分組+線性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輸出格式
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。
。
狀態轉移方程如下:
dp[i] = max( dp[i-1] , dp[i-2]+cnt[score] )
需要注意的是,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取模後的值。