hdu 6188 Duizi and Shunzi
Posted 爱种树的码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 6188 Duizi and Shunzi相关的知识,希望对你有一定的参考价值。
首先最优解时每个数如果作为顺子,那么只可能为1次或者2次。首先将所有非0个数变为1或者2。在考虑特殊情况,对于某区间1 1 2 1 1时,用作两个顺子会更优。
同理 1 1 2 1 2 1 1等等类似的也是这样,总结可得1 1 2或者1 1 1化为顺子为最优解,剩下的2都为对子。
#include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<cmath> #include<set> #include<stack> #define ll long long #define pb push_back #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)>(y)?(y):(x)) #define cls(name,x) memset(name,x,sizeof(name)) #define fs first #define sc second #define mp make_pair #define L(x) (1<<x) #define next Next using namespace std; const int inf=1e9+10; const ll llinf=1e16+10; const int maxn=1e6+10; const int maxm=1e3+10; const int mod=1e9+7; int n; int A[maxn]; int c[maxn]; int main() { //freopen("in.txt","r",stdin); while(~scanf("%d",&n)) { cls(c,0); for(int i=1;i<=n;i++) { scanf("%d",&A[i]); c[A[i]]++; } int ans=0; for(int i=1;i<=n;i++) { if(c[i]>=3) { if(c[i]%2==1) { ans+=(c[i]-1)/2; c[i]=1; } else { ans+=(c[i]-2)/2; c[i]=2; } } } //ci变为1或2 for(int i=1;i<=n-2;i++) { if(c[i]==1&&c[i+1]==1&&c[i+2]) { c[i]=c[i+1]=0; c[i+2]--; ans++; } } for(int i=1;i<=n;i++) { if(c[i]==2) ans++; } printf("%d\n",ans); } return 0; }
以上是关于hdu 6188 Duizi and Shunzi的主要内容,如果未能解决你的问题,请参考以下文章