牛客周赛 Round65 补题DEF

目录

D.医生

E.降温(easy))

F.降温(hard)


D.医生

思路:从范围来看m和k,可知我们可以将每一个字符串看成一个二进制数,将他们转换成十进制后,进行深度搜索,每种药有可选或不选两种情况,当搜到最后一种药时,我们只需将病人的十进制数与我们所选的药所组成的十进制数进行与运算,若最后结果与病人的十进制数相等,则说明我们所选的药包含病人的这些病,然后我们可以再加个剪枝,如果当前选的药数已经大于目前的最小值可以直接回溯。

Code:

cpp 复制代码
int n,m,ans;
int medicine[15],people[10005],k;

void dfs(int depth,int num,int medi,int id)
{
    if(num>=ans) return ;
    if(depth==k+1)
    {
        if((medi&people[id])==people[id]) 
        {
            ans=min(ans,num);
        }
        return ;
    }

    dfs(depth+1,num+1,medi|medicine[depth],id);
    dfs(depth+1,num,medi,id);

    return ;
}
void solve()
{
   cin>>n>>m;
   for(int i=1;i<=n;i++)
   {
    for(int j=1;j<=m;j++)
    {
        char c;cin>>c;
        int x=c-'0';
        if(x)
        {
            people[i]|=(1<<(m-j));
        }
    }
   }

   cin>>k;
   for(int i=1;i<=k;i++)
   {
    for(int j=1;j<=m;j++)
    {
        char c;cin>>c;
        int x=c-'0';
        if(x)
        {
            medicine[i]|=(1<<(m-j));
        }
    }
   }

   for(int i=1;i<=n;i++)
   {
       ans=1e18;
       dfs(1,0,0,i);
       if(ans==1e18) cout<<-1<<endl;
       else cout<<ans<<endl;
   }
}

E.降温(easy)

思路:贪心,只有当前一项比后一项大于等于x的时候才算寒潮,所以如果要使寒潮天数最大,我们要尽可能使ai变大,这样ai-ai+1>=x的概率才更大,如果第一个数为-999,则a1=50,其他数如果ai!=-999,ai-1-ai>=x则寒潮天数+1,如果ai=-999,若ai-1-x>=-50,则当ai=ai-1-x时寒潮天数增加,反之ai=50。求最小天数也一样,我们尽可能使ai-1-x超过-50这个边界,即ai尽可能小。

Code:

cpp 复制代码
constexpr int N=1005,mod=998244353;

int a[N],b[N],n,x;

void solve()
{
   cin>>n>>x;
   int ma=0;
   for(int i=1;i<=n;i++)
   {
    cin>>a[i];
    b[i]=a[i];
    if(i==1)
    {
        if(a[i]==-999)
        a[i]=50;
        continue;
    }
    if(a[i]!=-999)
    {
        if(a[i-1]-a[i]>=x)
            ma++;
    }
    else
    {
        if(a[i-1]-x>= -50) 
        {
            ma++;
           a[i]=a[i-1]-x;
        }
        else a[i]=50; 
    }  
   }
   cout<<ma<<' ';
   int mi=0;
   for(int i=1;i<=n;i++)
   {
    if(i==1)
    {
        if(b[i]==-999)
        b[i]=-50;
        continue;
    }
    if(b[i]!=-999)
    {
        if(b[i-1]-b[i]>=x) mi++;
    }
    else
    {
        if(b[i-1]-x >= -50)
        {
            b[i]=b[i-1]-x+1;
        }
        else b[i]=-50;
    }
   }
   cout<<mi;
}

F.降温(hard)

思路:与E题思路一样,改下数据范围即可。

Code:

cpp 复制代码
constexpr int N=1e5+5,mod=1e9+7,spj=-999999999;
constexpr int minn=-5*1e8,maxn=5*1e8;
int a[N],b[N],n,x;

void solve()
{
  cin>>n>>x;
  int ma=0;
  for(int i=1;i<=n;i++)
  {
    cin>>a[i];
    b[i]=a[i];
    if(i==1)
    {
        if(a[i]==spj)
        {
            a[i]=maxn;
        }
        continue;
    }
    if(a[i]!=spj)
    {
        if(a[i-1]-a[i]>=x) ma++;
    }
    else
    {
        if(a[i-1]-x>=minn)
        {
            a[i]=a[i-1]-x;
            ma++;
        }
        else a[i]=maxn;
    }
  }
  cout<<ma<<' ';
  int mi=0;
  for(int i=1;i<=n;i++)
  {
    if(i==1)
    {
        if(b[i]==spj)
            b[i]=minn;
        continue;
    }
    if(b[i]!=spj)
    {
        if(b[i-1]-b[i]>=x)
            mi++;
    }
    else
    {
        if(b[i-1]-x>=minn) b[i]=b[i-1]-x+1;
        else b[i]=minn;
    }
  }
  cout<<mi;
}
相关推荐
devilnumber1 小时前
Java 递归算法 详解 + 核心要点 + 实战运用 + 避坑指南
java·开发语言·算法
hai3152475432 小时前
一种通过空间几何转换进行软件编程计算的方式与现有计算的对比
人工智能·深度学习·数学建模·硬件架构·几何学·图论·拓扑学
unicrom_深圳市由你创科技2 小时前
哪些控制逻辑应该放在 PLC,哪些放在上位机?
c++
asdfg12589633 小时前
JavaBean是什么?怎么理解?有什么用途?
java·开发语言
dsyyyyy11013 小时前
JavaScript变量
开发语言·javascript·ecmascript
‎ദ്ദിᵔ.˛.ᵔ₎3 小时前
双指针、滑动窗口、前缀和、二分查找 算法
算法
顾北顾3 小时前
多头注意力机制
人工智能·深度学习·算法
H178535090963 小时前
SolidWorks_基于草图的实体特征20_特征错误排查
算法·3d建模·solidworks
hujinyuan201604 小时前
2025年12月中国电子学会青少年机器人技术等级考试试卷(二级) 真题+答案
人工智能·算法·机器人
玖玥拾4 小时前
C/C++ 基础笔记(十三)继承
c语言·c++·继承