牛客周赛 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;
}
相关推荐
灰子学技术4 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
那个村的李富贵4 小时前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
二十雨辰4 小时前
[python]-AI大模型
开发语言·人工智能·python
power 雀儿4 小时前
Scaled Dot-Product Attention 分数计算 C++
算法
Yvonne爱编码4 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚4 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
熬夜有啥好4 小时前
数据结构——哈希表
数据结构·散列表
你这个代码我看不懂4 小时前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
pas1364 小时前
41-parse的实现原理&有限状态机
开发语言·前端·javascript
琹箐5 小时前
最大堆和最小堆 实现思路
java·开发语言·算法