您的位置:首页 > 其它

XTUOJ 1246 Heartstone 贪心

2016-06-16 10:37 260 查看
题意:挺好懂得

分析:先计算出如果不能用(减2)操作,至少需要多少个(减3)操作,这个很好计算

然后就是尽量多的去减少(减3)操作,肯定先抹平 余2 和 余1 的,然后就可以了

#include <cstdio>
#include <iostream>
#include <ctime>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N=1e5+5;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
int f
,a
,d[6];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)){
memset(d,0,sizeof(d));
int sum=0,c=0;
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
++d[a[i]%6];
sum+=a[i]/6;
if(a[i]%6==1){
if(a[i]>6)++c;
}
}
int ret=0;
for(int i=0;i<=m;++i){
int ans;
if(i<=d[1]+d[2]+d[4]+d[5]){
ans=d[1]+d[2]+d[4]+d[5]-i+d[4]+d[5]+d[3]+sum*2;
}
else {
int k[6];
for(int j=1;j<=5;++j)k[j]=d[j];
k[2]=k[4];k[4]=0;
k[3]+=k[5];k[5]=0;
k[1]=0;
int tmp=sum-c;
k[2]+=c;k[3]+=c;
int t=i-d[1]-d[2]-d[4]-d[5];
if(t<=k[2]){
k[2]-=t;
ans=tmp*2+k[2]+k[3];
}
else {
t-=k[2];k[2]=0;
int p=t/3;
if(tmp<=p){
p-=tmp;
tmp=0;
}
else tmp-=p,p=0;
t=t%3+p*3;
t/=2;
ans=max(0,tmp*2+k[3]-t);
}
}
ret=(ret+ans)%mod;
}
printf("%d\n",ret);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: