Jongmah CodeForces - 1110D
Posted smallhester
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jongmah CodeForces - 1110D相关的知识,希望对你有一定的参考价值。
题意:你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组?
题解:三个一模一样的顺子等于三个对子(三张)
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<sstream> #include<cmath> #include<stack> #include<map> #include<cstdlib> #include<vector> #include<string> #include<queue> using namespace std; #define ll long long #define llu unsigned long long #define INF 0x3f3f3f3f const double PI = acos(-1.0); const int maxn = 1e6+10; const int mod = 1e9+7; int a[maxn],cnt[maxn]; int dp[maxn][3][3]; //dp[j][j][k]表示数字1-i,有j个(i-1,i,i+1),有k个(i,i+1,i+2) int main() { int n,m; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d", &a[i]); cnt[a[i]]++; } memset(dp,-INF,sizeof dp); dp[0][0][0] = 0; for(int i=0;i<=m+1;i++){ for(int j=0;j<3;j++){ for(int k=0;k<3;k++){ if(dp[i][j][k] < 0) continue; int now = cnt[i+1]-j-k; //前面有j个(i-1,i,i+1)和k个(i,i+1,i+2),现在有cnt[i+1]个i+1,可以形成cnt[i+1]-j-k个新的三元组 for(int t=0;t<3 && t<=now;t++){ dp[i+1][k][t] = max(dp[i+1][k][t],dp[i][j][k] + (now - t) / 3 + t); } } } } printf("%d ",dp[m+1][0][0]); }
以上是关于Jongmah CodeForces - 1110D的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 1110D. Jongmah 动态规划