NOIP2015斗地主(搜索+模拟+贪心)

本文介绍了一种解决类似斗地主游戏中最优出牌策略的算法。通过枚举和贪心策略结合的方式,实现对随机数据的有效处理,旨在找到最少的出牌次数。文章详细解释了搜索算法的具体步骤,并提供了C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

%%%Luan

题面就不说了,和斗地主一样,给一组牌,求最少打几次。

注意一点,数据随机,这样我们瞎搞一搞就可以过,虽然直接贪心可以证明是错的。

枚举方法,每次搜索按照(三顺子>二顺子>普通顺子)枚举一个进入下一层搜索。

在每层搜索中我们都要枚举打其他牌的方法,用贪心的结果+顺子数来更新答案。

具体方法是(想象你手里有这么多牌你该怎么打),枚举四代二,四代一,三代二,三代一,对和单。

注意我要带的必须是恰好两个或一个,不然会被随机数据hack。。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int di[20],cnt[20],ans,n,t,a,b;
inline int counting(){
    int jians=0;
    for(int i=1;i<=14;++i)di[i]=cnt[i];
    for(int i=1;i<=13;++i)
      if(di[i]>=4)
        for(int j=1;j<=14;++j)
          if(i!=j&&di[j]==2&&di[i]>=4)
            for(int k=j+1;k<=14;++k)
              if(k!=i&&di[k]==2){di[i]-=4;di[j]-=2;di[k]-=2;jians++;break;}
    for(int i=1;i<=13;++i)
      if(di[i]>=4)
        for(int j=1;j<=14;++j)
          if(i!=j&&di[j]==1&&di[i]>=4)
            for(int k=j+1;k<=14;++k)
              if(k!=i&&di[k]==1){di[i]-=4;di[j]--;di[k]--;jians++;break;} 
    for(int i=1;i<=13;++i)
      if(di[i]>=4)
        for(int j=1;j<=14;++j)
          if(i!=j&&di[j]==2){di[j]-=2;di[i]-=4;jians++;break;}
    for(int i=1;i<=13;++i)while(di[i]>=4)jians++,di[i]-=4;
    for(int i=1;i<=13;++i)
      if(di[i]>=3)
        for(int j=1;j<=14;++j)
          if(i!=j&&di[j]==2){if(di[i]<3)break;di[i]-=3;di[j]-=2;jians++;}
    for(int i=1;i<=13;++i)
      if(di[i]>=3)
        for(int j=1;j<=14;++j)
          if(i!=j&&di[j]==1){if(di[i]<3)break;di[j]--;di[i]-=3;jians++;} 
    for(int i=1;i<=13;++i)while(di[i]>=3)jians++,di[i]-=3;
    for(int i=1;i<=14;++i)while(di[i]>=2)jians++,di[i]-=2;
    for(int i=1;i<=14;++i)while(di[i])jians++,di[i]--;
    return jians;      
} 
void dfs(int deep){
    if(deep>=ans)return;
    for(int i=1;i<=14;++i){
        if(cnt[i])break;
        if(i==14){
            ans=deep;return;
        }
    }
//    for(int i=1;i<=14;++i)cout<<cnt[i]<<" ";cout<<"   ";
    int cmd=counting();//cout<<cmd<<endl;
    if(cmd+deep<ans)ans=cmd+deep;
    for(int i=1;i<=10;++i)if(cnt[i]>=3)
      for(int j=i+1;j<=12;++j){
          bool tag=0;
          for(int k=i;k<=j;++k)
              if(cnt[k]<3){
                  tag=1;
                break;
               }
          if(tag)break;
         for(int k=i;k<=j;++k)cnt[k]-=3;
         dfs(deep+1);
         for(int k=i;k<=j;++k)cnt[k]+=3;
       }
    for(int i=1;i<=10;++i)if(cnt[i]>=2)
      for(int j=i+2;j<=12;++j){
           bool tag=0;
           for(int k=i;k<=j;++k)
               if(cnt[k]<2){
                   tag=1;
                   break;
               }
        if(tag)break;
        for(int k=i;k<=j;++k)cnt[k]-=2;
        dfs(deep+1);
        for(int k=i;k<=j;++k)cnt[k]+=2;
      }
    for(int i=1;i<=8;++i)
      for(int j=i+4;j<=12;++j){
          bool tag=0;
          for(int k=i;k<=j;++k)
            if(!cnt[k]){
                  tag=1;
                  break;
            }
        if(tag)break;
        for(int k=i;k<=j;++k)--cnt[k];
        dfs(deep+1);
        for(int k=i;k<=j;++k)++cnt[k];
      }
}
int main(){
    scanf("%d%d",&t,&n);
    while(t--){
        memset(cnt,0,sizeof(cnt));
        for(int i=1;i<=n;++i){
            scanf("%d%d",&a,&b);
            if(a>=3||a<=13)cnt[a-2]++;
            if(a==0)cnt[14]++;
            if(a==1)cnt[12]++;
            if(a==2)cnt[13]++; 
        }
        ans=0x3f3f3f3f;
        dfs(0); 
        printf("%d\n",ans); 
    }
    return 0; 
}

转载于:https://www.cnblogs.com/ZH-comld/p/9599282.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值