牛客周赛 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的时候才算寒潮,所以如果要使寒潮天数最大,我们要尽可能使a[i]变大,这样a[i]-a[i+1]>=x的概率才更大,如果第一个数为-999,则a[1]=50,其他数如果a[i]!=-999,a[i-1]-a[i]>=x则寒潮天数+1,如果a[i]=-999,若a[i-1]-x>=-50,则当a[i]=a[i-1]-x时寒潮天数增加,反之a[i]=50。求最小天数也一样,我们尽可能使a[i-1]-x超过-50这个边界,即a[i]尽可能小。

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;
}
相关推荐
我不是代码教父2 小时前
[原创](Modern C++)现代C++的关键性概念: 流格式化
c++·字符串格式化·流格式化·cout格式化
利刃大大3 小时前
【回溯+剪枝】找出所有子集的异或总和再求和 && 全排列Ⅱ
c++·算法·深度优先·剪枝
子燕若水3 小时前
mac 手工安装OpenSSL 3.4.0
c++
来恩10033 小时前
C# 类与对象详解
开发语言·c#
*TQK*3 小时前
ZZNUOJ(C/C++)基础练习1041——1050(详解版)
c语言·c++·编程知识点
komo莫莫da3 小时前
寒假刷题Day19
java·开发语言
Rachela_z3 小时前
代码随想录算法训练营第十四天| 二叉树2
数据结构·算法
细嗅蔷薇@3 小时前
迪杰斯特拉(Dijkstra)算法
数据结构·算法
追求源于热爱!3 小时前
记5(一元逻辑回归+线性分类器+多元逻辑回归
算法·机器学习·逻辑回归
ElseWhereR4 小时前
C++ 写一个简单的加减法计算器
开发语言·c++·算法